I have a Swift UI struct called MyWatchView with this stack.
VStack (alignment: .center)
{
HStack
{
Toggle(isOn: $play)
{
Text("")
}
.padding(.trailing, 30.0)
.hueRotation(Angle.degrees(45))
if play
{
MyWatchView.self.playSound()
}
}
}
It also has @State private var play = false; And a function playSound like this:
static private func playSound()
{
WKInterfaceDevice.current().play(.failure)
}
I am getting an error of Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols I think this is probably something that I am not understanding in the way structs work in Swift.
I am trying to use a timer to trigger the play sound function. This is my code in my View Controller Class from my iOS storyboard app timer = Timer.scheduledTimer(timeInterval: interval, target: click class, selector: #selector(clickClass.repeatSound), userInfo: clickClass, repeats: switchView.isOn)
You are doing this:
if play
{
MyWatchView.self.playSound()
}
in a context where only View
s are expected. The return type of the function is Void
(or ()
), which is why you are getting the error.
If you want to just play a sound when you click the Toggle
, you probably want to use a Button
instead:
Button(action: {
MyWatchView.self.playSound()
}) {
Text("")
}
If you want a Toggle
(e.g., to update a Bool
variable), you can do this:
Toggle(isOn: $play)
{
Text("")
}
.padding(.trailing, 30.0)
.hueRotation(Angle.degrees(45))
.onTapGesture {
MyWatchView.self.playSound()
}