swift 3 : How to have a "global" button and action used in multiple controllers

标签 swift uiviewcontroller swift3

假设我有 20 个 View Controller ,它们都需要相同的按钮和操作,有没有办法避免在每个 Controller 中实现相同的 ibaction?我应该用我的操作子类化 UIViewController 然后将我的 Controller 基于该子类吗?或者还有其他方法吗?

最佳答案

我最终遵循了此处概述的基于协议(protocol)/值(value)的方法 -> subclassing-can-suck-and-heres-why

在我的例子中,我有一个位于多个 View 上的“设置”按钮。

protocol SettingsButtonRenderer {
    func goToSettings()
}

extension SettingsButtonRenderer where Self: UIViewController {
    func goToSettings() {
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let settingsNavigationController = storyBoard.instantiateViewController(withIdentifier: "SettingsNavigationController")
        present(settingsNavigationController, animated: true, completion: nil)
     }
}

class DeliveryTabViewController: UIViewController, SettingsButtonRenderer {

    @IBOutlet weak var goToSettingBtn: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        goToSettingBtn.target = self
        goToSettingBtn.action = #selector(DeliveryTabViewController.settingsClicked as (DeliveryTabViewController) -> () -> ())
    }

    func settingsClicked() {
        goToSettings()
    }
}

关于 swift 3 : How to have a "global" button and action used in multiple controllers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40980274/

相关文章:

ios - 将 ViewController 与 swift 中的类型进行比较

ios - swift 3 将 json 数组解析为键值

ios - 关闭 Popover 后更新第一个 View

swift - 如何禁用 Mapkit 中的默认标注 View ?

ios - 我想将 bool 状态保存到 Firebase 数据库中的用户配置文件

ios - Swift/LaunchScreen 背景

ios - 如何在 Swift3 iOS 中的视频 AVAsset 上添加淡入和淡出效果

xcode - Swift 编译器错误 : Use of undeclared type 'EKEventStore'

ios - 检查 UIAlertController 是否出现在 XCTest 案例中

ios - 带有向下滑动动画的自定义推送 View Controller