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

时间:2018-02-14 16:08:08

标签: 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
        }
        ...
    }

有没有办法让一个if语句,而不是每个控制器的一个if语句?像,

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

由于

2 个答案:

答案 0 :(得分:1)

您仍然需要使用<footer class="footer"> <div class="container"> <span class="text-muted">Place sticky footer content here.</span> </div> </footer>进行强制转换,但是为了不对具有as? ...的所有视图控制器执行此操作,您可以定义一个基本协议,强制执行符合它的所有类以使其具有bgButton

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!
    ....
}

答案 1 :(得分:0)

在给定的场景中,用all替换你的all if意味着你应该有一个公共基类或你的类符合相同的协议。但是,类型转换仍然需要。您可以使用以下代码来实现所需的功能。

创建协议BackgroundButton

public protocol BackgroundButton {
var bgButton: UIButton { get }
}

使用此协议将所有自定义UIViewController与此协议一致,如下所示

extension AddNewViewController : BackgroundButton {
var bgButton : UIButton {
    return yourbutton // Use any instance of UIButton from your AddNewViewController 
    }

}

extension EditViewController : BackgroundButton {
var bgButton : UIButton {
    return yourbutton // Use any instance of UIButton from your EditViewController 
    }

}

最后像这样更新您的方法

func showHideDetails(controller: UIViewController, isHidden: Bool) {
  ...
  if let controller = controller as? BackgroundButton {
controller.bgButton.isHidden = isHidden
controller.bgButton. //Do any thing which you want with your button
  }
  ...
}

希望这可以帮助您减少if

的数量