非常基本:我需要将信息从一个视图传递到另一个视图。他们在同一个ViewController
。什么是最优雅的方法来解决这个问题?
NotificationCenter
不是一个选项
如果我可以直接从其他视图访问某个视图的某些属性,那将是理想的
答案 0 :(得分:2)
假设您有两种观看view1
和view2
。
例如,view2
中的某些数据已更改,您需要将此数据传递给view1
。我用委托模式做这个。所以这是设置:
protocol View2Delegate {
func didChangeSomeData(data: String)
}
现在在view2
class View2: UIView {
var delegate: View2Delegate?
var text: String = String() {
didSet {
self.delegate.didChangeSomeData(data: text)
}
}
}
并在view1
class View1: UIView, View2Delegate {
var textToChange: String = String()
func didChangeSomeData(data: String) {
// Do whatever you want with that changed data from view2
textToChange = data
}
}
并在viewController
class MyViewController: UIViewController {
var: view1 = View1()
var: view2 = View2()
func viewDidLoad() {
super.viewDidLoad()
view2.delegate = view1
}
现在,如果你真的不想结合view1
和view2
,你可以通过view2
中ViewController
的相同模式更改来聆听,然后通过它直接到view1
via属性访问器。
class MyViewController: UIViewController, View2Delegate {
var: view1 = View1()
var: view2 = View2()
func viewDidLoad() {
super.viewDidLoad()
view2.delegate = self
}
func didChangeSomeData(data: String) {
view1.textToChange = data
}
中协议的更多信息
更新
您也可以使用Key Value Observing模式。您可以这样设置:
class MyViewController: UIViewController {
var view1 = View1()
var view2 = View2()
override func viewDidLoad() {
super.viewDidLoad()
let observation = view2.observe(\.text) { (observed, change) in
if let newValue = change.newValue {
view1.textToChange = newValue
}
}
}
}
答案 1 :(得分:0)
在2个对象之间进行通信的方式(可能是UIView或不是UIView)如前一个答案中建议的那样使用委托或KVO。
您还可以使用完成处理程序,使用闭包非常简单。
以下是一个例子
class Object1 {
func foo(completed: () -> Void) {
print("do some work")
completed()
}
}
class Object2 {
func callFoo() {
let obj1 = Object1()
obj1.foo {
print("foo() from object 1 completed")
}
}
}
let obj2 = Object2()
obj2.callFoo()
// should print:
// do some work
// foo() from object 1 completed