SwiftUI:自定义按钮的动作没有触发

3

我正在使用SwiftUI在tvOS上测试一些东西。当我给一个按钮添加自定义样式时,按钮的“动作”不会被触发。在这个例子中,我想要打印“pressed”,但添加函数也不起作用。

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

为了说明我为什么想要自定义按钮样式。

当我不使用任何按钮样式时,“动作”可以正常工作,但“onFocusChange”函数从未被调用。我需要它!

但是……当我使用一个按钮样式时,“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)
    }
}

2
已知的 tvOS 限制。向苹果提交反馈 - 反馈越多,效果越好。 - Asperi
你有任何解决方法吗?比如将它堆叠在vstack中,使其可聚焦可以工作,但不知道如何在vstack上触发Siri遥控器的操作(选择、点击)。似乎只能通过button(action..)实现。 - samecat
@Asperi:有什么解决方案吗? - Abhishek Thapliyal
@AbhishekThapliyal,以下的解决方案是否适用于您? - Asperi
我是通过状态变量进行管理的,这是否是问题所在? - Abhishek Thapliyal
1个回答

0

现在可以使用SwiftUI 2.0进行工作。 您可以在要聚焦的视图上使用以下环境对象。 此外,添加状态或绑定以向上冒泡到父视图。

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

然后,您可以调用以下修饰符,在视图获得焦点或失去焦点时调用。在这里,您可以更改绑定或状态变量。

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

最后,您可以使用绑定或状态来修改您的视图。
.scaleEffect(self.focused ? 1.1 : 1)
.animation(.linear(duration: 0.1))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接