📅  最后修改于: 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 开发中调用另一个视图控制器方法的方法,可以根据实际需要选择合适的方式来实现。