如何在SwiftUI中编程点击按钮

7

使用Storyboard时,我们可以通过编程的方式来点击按钮或字段,方法如下:

@IBOutlet weak var negativeButton: UIButton!
negativeButton.sendActions(for: .touchUpInside)

我该如何使用SwiftUI重新创建相同的内容?

3个回答

3

在SwiftUI中,无法像在UIKit中一样处理Button。因为在SwiftUI视图(Button)中没有与storyboard中相似的对象/outlet,所以它没有那样的功能。

相反,您可以创建函数,并使用该函数来触发按钮操作,您可以从任何地方调用该函数,无论何时需要。

请参考下面的示例,以获得更清晰的理解。

struct ContentView: View {

    var body: some View {
        Button(action: {
            buttonAction()
        }, label: {
            Text("Tap Here")
        })
    }

    func buttonAction(){
        //do write here your button action logic
        print("button tapped")
    }

}

这肯定会起作用,但如果标签是 NavigationLink,则不会。有什么想法吗?isActive 已被弃用。 - chitgoks

1
在SwiftUI中做同样的事情是不可能的,SwiftUI甚至不知道Button的存在 "作为对象!但作为渲染和它的职责存在"。使用Button的原因是它在SwiftUI中的功能,这意味着触发一个Action() -> Void,因此你不需要不能以编程方式点击Button,因为你可以随时在任何地方运行它的操作。 例如:您可以从想要以编程方式点击按钮的位置运行actionOfButton(),它将起作用。如果您的按钮根据每次点击而改变外观,则应在actionOfButton()中进行操作。因此,可以同时具有操作和渲染,这就是在SwiftUI中以编程方式点击按钮的总结。
import SwiftUI

struct ContentView: View {
    var body: some View {

        Button("tap") {
            
            actionOfButton()
            
        }

    }
    
    func actionOfButton() {
        
        print("Hello, world!")
        
    }
    
}

当然,但这不是有问题吗?当我点击按钮时,如何测试特定的方法是否被调用?如果无法实现这一点,那么唯一的测试方法就是使用UITest。有人知道我是否遗漏了什么吗? - undefined

0
可能的解决方案是在结构视图中声明您的操作变量,每当需要时,您可以手动调用按钮操作。

这里是演示。

struct ContentViewButtonAction: View {
    
    var buttonAction: ()->Void {
        {
            print("Button tapped!!")
        }
    }
    
    var body: some View {
        Button(action: buttonAction, label: {
            Text("Tap Button")
        })
        
        Button(action: {
            print("Second button tapped")
            buttonAction()
        }, label: {
            Text("Tap Button to execute first button action")
        })
    }
}

enter image description here


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