swift - 使用 Swift 在 switch/case 语句中设置 UIViewController

标签 swift xcode uiviewcontroller

我正在尝试加载基于按钮按下的 View 。我想我可以在下面做这样的事情,我定义了一个通用的 UIViewController,然后将它设置为 switch/case 语句中的特定 UIViewController,但它显然不能这样工作。我做错了什么?

@objc func menuButton(sender: UIButton) {
    var view: UIViewController!
    switch sender.tag {
        case 0:
            view = MenuViewController()
            view.menuType = .Account
        case 1:
            view = MenuViewController()
            view.menuType = .Sync
        case 2:
            view = AuthViewController()
            view.menuType = .Auth
        default: break
    }
    self.navigationController?.pushViewController(view, animated: true)
}

最佳答案

如果我没记错的话,编译器应该会报错:

Value of type 'UIViewController' has no member 'menuType'

这里有几个选项可以解决这个问题:

解决方案一

使用转换

@objc func menuButton(sender: UIButton) {
    var view: UIViewController!
    switch sender.tag {
        case 0:
            view = MenuViewController()
            (view as? MenuViewController())?.menuType = .Account
        case 1:
            view = MenuViewController()
            (view as? MenuViewController())?.menuType = .Sync
        case 2:
            view = AuthViewController()
            (view as? AuthViewController())?.menuType = .Auth
        default: break
    }
    self.navigationController?.pushViewController(view, animated: true)
}

方案二

创建协议(protocol)MenuProtocol

protocol MenuProtocol {
    var menuType: MenuType { get set }
}

并使 MenuViewControllerAuthViewController 实现该协议(protocol)。然后您可以执行以下操作:

@objc func menuButton(sender: UIButton) {
    var view: (UIViewController & MenuProtocol)!
    switch sender.tag {
        case 0:
            view = MenuViewController()
            view.menuType = .Account
        case 1:
            view = MenuViewController()
            view.menuType = .Sync
        case 2:
            view = AuthViewController()
            view.menuType = .Auth
        default: break
    }
    self.navigationController?.pushViewController(view, animated: true)
}

关于swift - 使用 Swift 在 switch/case 语句中设置 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49277496/

相关文章:

swift - Swift 中的 Long Double

swift - C 语言的 FTDI D2XX API 在命令行控制台上工作,但在 macOS 上由 Xcode 和 Swift 编程构建的应用程序中始终返回零

ios - 是什么导致此 Crashlytics 编译警告? (自动链接在 '...' 处提供的 '...' 框架链接器选项不是 dylib)

ios - 从模态视图 Controller 推送/弹出到另一个 View Controller (包括图片)

ios - 如何在固定高度的特定 View 中附加 subview Controller

ios - 如何在xcode中为ios项目创建动态库?

iphone - CoreData (for iphone) 存储图片

ios - 如何在 ViewDidLoad 之前完成功能

iphone - 在 iOS 中嵌套 UIViewController

ios - fatal error : Unexpectedly found nil while unwrapping an Optional value error in UITableViewCell?