SwiftUI:未触发自定义按钮的操作

SwiftUI: Action of custom button not triggered

使用 SwiftUI 在 tvOS 上测试一些东西。当我将自定义样式添加到按钮时,按钮的 "action" 没有被触发。在这个例子中,我想打印 "pressed",但是添加函数也不起作用。

是否也可以实现自定义操作触发器或者我做错了什么?

澄清为什么我想要自定义按钮样式。

当我不使用任何 buttonstyle 时,"action" 可以正常工作,但永远不会调用 "onFocusChange" 函数。我需要什么!

但是..当我使用 buttonstyle 时,onFocusChange 正在工作,但动作不是.....

struct CustomButton: View {
    @State private var buttonFocus: Bool = false
    var body: some View {
        VStack(alignment: .center){
            Button(action: {
                print("pressed")
            })
            {
                Text("Save")
            }
            .buttonStyle(TestButtonStyle(focused: buttonFocus))
            .focusable(true, onFocusChange: { (changed) in
                self.buttonFocus.toggle()
            })
        }    
    }
}

按钮样式:

struct TestButtonStyle: ButtonStyle {
    let focused: Bool

    public func makeBody(configuration: TestButtonStyle.Configuration) -> some View {
        configuration.label
            .foregroundColor(.white)
            .background(RoundedRectangle(cornerRadius: 5).fill(Color.red))
            .scaleEffect(focused ? 1.5 : 1.0)
    }
}

它现在可以与 SwiftUI 2.0 一起使用。 您可以在要关注的视图上使用以下环境对象。 另外,添加一个 State 或 Binding 以冒泡到您的父视图。

@Environment(\.isFocused) var isFocused: Bool
@Binding var focusedValue: Bool

然后,你可以调用下面的修饰符,这个修饰符会在View是否获得焦点时被调用。在这里您更改 Binding 或 State 变量。

.onChange(of: isFocused, perform: { value in
        self.focusedValue = value
    })

最后,您可以使用您的 Binding 或 State 来修改您的 View。

.scaleEffect(self.focused ? 1.1 : 1)
.animation(.linear(duration: 0.1))