在两个视图之间传递数据(在同一个ViewController中)

时间:2018-03-16 13:46:44

标签: ios swift model-view-controller

非常基本:我需要将信息从一个视图传递到另一个视图。他们在同一个ViewController。什么是最优雅的方法来解决这个问题?

NotificationCenter不是一个选项

如果我可以直接从其他视图访问某个视图的某些属性,那将是理想的

2 个答案:

答案 0 :(得分:2)

假设您有两种观看view1view2。 例如,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
  }

现在,如果你真的不想结合view1view2,你可以通过view2ViewController的相同模式更改来聆听,然后通过它直接到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
  }

有关Apple's Documentation

中协议的更多信息

更新

您也可以使用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