我的项目中有两个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可访问。
答案 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!