我在辅助类中有这个功能。这是显示/隐藏一些东西。
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
}
由于
答案 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
的数量