swift - 无需强制转换即可访问 UIViewController 类属性?

标签 swift

我在辅助类中有这个函数。这是为了显示/隐藏一些东西。

   func showHideDetails(controller: UIViewController, isHidden: Bool) {
        ...
        if controller is AddNewViewController {
            let addNewViewController = controller as! AddNewViewController
            addNewViewController.bgButton.isHidden = isHidden
        } else if controller is EditViewController {
            let editViewController = controller as! EditViewController
            editViewController.bgButton.isHidden = isHidden
        }
        ...
    }

有没有办法让每个 Controller 都有一个 if 语句,而不是一个 if 语句?类似的东西,

if controller.hasProperty(bgButton) {
    controller.bgButton.isHidden = isHidden
}

谢谢

最佳答案

你还需要使用 as 进行转换吗? ...,但是为了不对所有具有 bgButton 的 View Controller 执行此操作,您可以定义一个基本协议(protocol),强制所有符合它的类都具有 bgButton :

public protocol Buttoned {
  var bgButton: UIButton { get set }

  func setHideButton(_ isHidden: Bool)
}

extension Buttoned {
  public func setHideButton(_ isHidden: Bool) {
    bgButton.isHidden = isHidden
  }
}

public class AddNewViewController: Buttoned {
    @IBOutlet fileprivate weak var bgButton: UIButton!
    ....
}

public class EditViewController: Buttoned {
    @IBOutlet fileprivate weak var bgButton: UIButton!
    ....
}

然后你可以像下面这样在实际的 View Controller 中处理这个 Action :

func showHideDetails(controller: UIViewController, isHidden: Bool) {
  ...
  if let controller = controller as? Buttoned {
    controller.setHideButton(isHidden)
  }
  ...
}

关于swift - 无需强制转换即可访问 UIViewController 类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48791519/

相关文章:

ios - 如何更新 UITableView 单元格文本字段中的核心数据值

swift - 使用 Swift3 子类化 CALayer + 隐式动画

ios - 如何在 swift 中每 N 个字符处为字符串添加分隔符?

ios - Swift 使边框 rof uiimageview 在外面

ios - 如何防止一次绘制多条线(快速)?

javascript - WkWebView Evaluatejavascript 返回不支持的类型错误

ios - 迭代字典数组的数组

ios - 将 TouchesMoved 中的最后位置与当前位置进行比较

ios - 如何使 splitViewController 在所有设备上表现相同

ios - 根据 TableViews 自定义单元格中点击的图像执行 segue