您可以在Objc.io article by Chris Eidhof 中很好地了解一些可以用来制作视图控制器的策略。
更具体地说,对于您的情况,您可能倾向于拥有一个视图控制器层次结构,其中有一个父视图控制器和子视图控制器。
为了让他们交流,我认为最好的方法是:
1 - 让父控制器拥有一个“模型”类;此类对您的 UI 属性进行建模(按钮是否突出显示?什么是文本字段内容?等等)
2 - 当您从父级创建子控制器时,将共享模型传递给它。
3 - 使用 KVO (tutorial here) 确保您的 UI 对模型更改做出反应。
在代码中,它看起来像这样(Swift 2.0):
private var myContext = 0
class MyModel : NSObject {
dynamic var buttonTitle : String = "default title"
}
class MyChildVC : UIViewController {
let model : MyModel
@IBOutlet var button : UIButton?
init(m : MyModel) {
model = m
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
self.model.addObserver(self, forKeyPath: "buttonTitle", options: .New, context: &myContext)
}
deinit {
self.model.removeObserver(self, forKeyPath: "buttonTitle", context: &myContext)
}
override func observeValueForKeyPath(keyPath: String?,
ofObject object: AnyObject?,
change: [String : AnyObject]?,
context: UnsafeMutablePointer<Void>) {
if (keyPath == "buttonTitle") {
button?.titleLabel?.text = self.model.buttonTitle
}
}
}
class MyParentVC : UIViewController {
let model = MyModel()
let vc1 : MyChildVC
init() {
self.vc1 = MyChildVC(m: model)
super.init(nibName: nil, bundle: nil)
}
func someOp() {
self.model.buttonTitle = "NewTitle"
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
一开始可能会让人望而生畏,但一旦你习惯了它(以及 KVO 特质),它就会变得很有魅力。
如果您选择视图控制器层次结构,请不要忘记阅读有关 view controllers containment 的信息。