📌  相关文章
📜  从另一个 ios swift 单击按钮时如何调用另一个视图控制器方法(1)

📅  最后修改于: 2023-12-03 15:36:16.816000             🧑  作者: Mango

从另一个 iOS Swift 点击按钮时如何调用另一个视图控制器方法

在 iOS 开发中,我们经常需要在一个视图控制器中调用另一个视图控制器的方法,以实现一些功能。下面是一些方法供参考:

方法一:利用代理调用另一个视图控制器方法

代理是 iOS 开发中常用的一种设计模式,它可以使得一个对象拥有另一个对象的方法,并在需要的时候调用。这种方式需要定义一个协议并实现一个代理对象,在需要调用的地方调用代理方法。

定义协议:

protocol SecondViewControllerDelegate: class {
    func doSomething(_ sender: SecondViewController)
}

其中,SecondViewControllerDelegate 是协议名,class 表示协议只能被类实现,doSomething 方法是我们定义的需要调用的方法。

在另一个视图控制器中实现代理:

class SecondViewController: UIViewController {
    weak var delegate: SecondViewControllerDelegate?
    
    @IBAction func buttonAction(_ sender: Any) {
        delegate?.doSomething(self)
    }
}

其中,weak var delegate 表示定义一个弱引用的代理对象,buttonAction 是按钮的点击事件。在点击按钮的时候,我们调用代理方法 delegate?.doSomething(self)

在第一个视图控制器中,实现代理方法:

class ViewController: UIViewController, SecondViewControllerDelegate {

    @IBAction func buttonAction(_ sender: Any) {
        let secondVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "secondVC") as! SecondViewController
        secondVC.delegate = self
        navigationController?.pushViewController(secondVC, animated: true)
    }

    func doSomething(_ sender: SecondViewController) {
        print("doSomething Called")
    }
}

其中,ViewController 实现了协议 SecondViewControllerDelegate,并实现了协议中的方法 doSomething。在点击按钮的时候,我们实例化一个 SecondViewController 对象,并设置其代理为当前视图控制器 self,接着将其推入导航栈中。当在 SecondViewController 中点击按钮时,会调用代理方法,这样我们就可以在第一个视图控制器中处理相应的逻辑了。

方法二:利用通知中心广播调用另一个视图控制器方法

通知中心是 iOS 开发中另一个常用的设计模式,它通过广播机制将消息发送给感兴趣的对象,从而实现对象之间的消息传递。这种方式需要定义一个通知名称,在需要调用的地方发送通知,接着在监听通知的地方处理相应的逻辑。

定义通知名称:

extension Notification.Name {
    static let didTapButton = Notification.Name("didTapButton")
}

其中,didTapButton 是通知名称。

在另一个视图控制器中发送通知:

class SecondViewController: UIViewController {
    @IBAction func buttonAction(_ sender: Any) {
        NotificationCenter.default.post(name: .didTapButton, object: nil)
    }
}

其中,buttonAction 是按钮的点击事件,在点击按钮的时候,我们发送通知 didTapButton

在第一个视图控制器中监听通知:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(doSomething(_:)), name: .didTapButton, object: nil)
    }

    @objc func doSomething(_ notification: Notification) {
        print("doSomething Called")
    }
}

其中,addObserver 方法表示我们将监听 didTapButton 通知,并且当通知被触发时会回调 doSomething 方法,这样我们就可以在第一个视图控制器中处理相应的逻辑了。

注意:通知中心的广播机制是全局的,因此在使用时需要注意命名,避免出现重复的通知导致混乱。

以上就是两种在 iOS Swift 开发中调用另一个视图控制器方法的方法,可以根据实际需要选择合适的方式来实现。