调用ViewController可以调用VC

时间:2018-05-23 07:36:26

标签: ios swift xcode

我的项目中有两个VC。我有一个UIButton,它与第二个VC分开。我有数据发送到这个VC。我希望第二个VC能够添加到发送的数组,然后将其发回。 在我的主要VC中我有:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let toViewController = segue.destination as! SaveViewController
    toViewController.masterView = self

在第二个VC中我有:

var masterView:UIViewController!

...

override func viewWillDisappear(_ animated: Bool) {
     masterView.listArray = listArray
 }

我得到的是

  

'UIViewController'类型的值没有成员'listArray。'

两个VC都声明了listArray。如果这是一个正确的方法去做我想做的事情,我显然假设我必须在第二个ViewController中做更多的配置,以便使其他VC可访问。

2 个答案:

答案 0 :(得分:2)

可能这是将数据传回上一个视图控制器的正确方法。虽然您可以遵循其他选项来实现所需的功能,但我建议您遵循委派模式方法。

对于你的情况,你可以这样做 - 例如 - :

根据"如何应用授权?" 部分this answer,我们应该做的第一件事是实现所需的协议:

protocol SaveViewControllerDelegate: class {
    // I assumed that 'listArray' is an array of strings, change it to the desired type...
    func saveViewControllerWillDisappear(_ listArray: [String], viewController: UIViewController)
}

因此,在SaveViewController中,您应该创建-weak- SaveViewControllerDelegate的实例,并调用其方法以获取所需的行为:

class SaveViewController: UIViewController {
    weak var delegate: SaveViewControllerDelegate? = nil
    var listArray: [String]!

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        // assuming that you already did the required update to 'listArray'
        // you would need to pass it here:
        delegate?.saveViewControllerWillDisappear(listArray, viewController: self)
    }
}

到目前为止,我们为SaveViewController添加了必要的代码,让我们跳转到MasterViewController(第一个视图控制器):

接下来,您需要符合SaveViewControllerDelegate,连接委托对象并实现其方法(上述答案中的步骤2到4):

class MasterViewController: UIViewController, SaveViewControllerDelegate {
    var listArray: [String]!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let toViewController = segue.destination as! SaveViewController

        // make sure to add this:
        toViewController.delegate = self

        toViewController.listArray = self.listArray
    }

    func saveViewControllerWillDisappear(_ listArray: [String], viewController: UIViewController) {
        print("here is my updated array list: \(listArray)")
    }
}

此时,从saveViewControllerWillDisappear返回时,应调用SaveViewController方法,包括listArray作为参数。

除了注意:

您遇到错误的原因是您将masterView声明为UIViewController,您应该做的是:

var masterView:MasterViewController!

请记住,这种做法仍然是我之前提到的 - 不合适的

答案 1 :(得分:0)

这是因为UIViewController没有元素listView

MasterView类型更改为:

var masterView: FirstViewController!