【发布时间】:2019-01-03 09:59:30
【问题描述】:
我有一个带有 6 个UIViewControllers 的应用程序。
任何viewcontroller 都具有这样的功能:
@IBAction func onHelp(_ sender: UIBarButtonItem) {
DispatchQueue.main.async(execute: { () -> Void in
let helpVC = self.storyboard?.instantiateViewController(withIdentifier: "Help") as! HelpViewController
helpVC.starter = "MapHelp"
helpVC.helpSubtitle = "Map"
self.present(helpVC, animated: true, completion: nil)
})
}
任何viewcontroller 中的任何IBAction 都呈现相同的HelpViewController,但传递不同的参数(starter 和helpSubtitle)。
由于我不喜欢重复代码,首先我认为应该将这个函数转换为更通用的东西。
但是:有没有办法创建一个通用的IBAction,适用于每个viewcontroller?
【问题讨论】:
-
UIBarButtonItem,这不是 NavigationController 按钮吗?将 NavigationController 子类化,添加该方法,然后在每个 ViewController 上添加协议扩展来检索参数怎么样? -
为什么不创建一个 BaseViewController,让你的所有 ViewController 都继承自那个,在每个 VC 中创建 IBAction,从所有子类调用相同的父类方法。这样代码就可以重用,你不必到处都写代码,也不必担心创建一个通用的 IBAction。使方法通用,保持 IBActions 分开。您也可以在基类方法的签名中提供参数,这可能因 VC 而异
-
还有什么理由你专门在主线程中这样做? IBActions 默认在主线程上执行。
-
@Larme :是的,它是一个导航控制器,但是,请你扩展一下吗?我不确定我是否理解您的解决方案。
-
我已经删除了我的答案。它不会真正起作用,因为协议方法不能是
@IBAction。
标签: swift function viewcontroller dry ibaction