Ios 使被调用的VC可以访问调用的ViewController

Ios 使被调用的VC可以访问调用的ViewController,ios,swift,xcode,Ios,Swift,Xcode,我有两个风险投资在我的项目。我有一个连接到第二个VC的UIButton。我有数据被发送到这个VC。我希望第二个VC能够添加到发送的数组中,然后将其发送回。 在我的主要VC中,我有: override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let toViewController = segue.destination as! SaveViewController toViewController.m

我有两个风险投资在我的项目。我有一个连接到第二个VC的UIButton。我有数据被发送到这个VC。我希望第二个VC能够添加到发送的数组中,然后将其发送回。 在我的主要VC中,我有:

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

    let toViewController = segue.destination as! SaveViewController
    toViewController.masterView = self
var masterView:UIViewController!
在第二个VC中,我有:

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

    let toViewController = segue.destination as! SaveViewController
    toViewController.masterView = self
var masterView:UIViewController!

我得到的是

“UIViewController”类型的值没有成员“listArray”


listary
在两个VCs中声明。如果这是一个正确的方法来进行我正在尝试做的事情,我显然认为我必须在第二个ViewController中进行更多的配置,以使其他VC可以访问

发生这种情况是因为
UIViewController
没有元素
listView

将主视图的类型更改为:

var masterView: FirstViewController!

这是因为
UIViewController
没有元素
listView

将主视图的类型更改为:

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

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

根据中的“如何应用授权?”部分,我们应该做的第一件事是实施所需的协议:

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
中,您应该创建
SaveViewControllerDelegate
的-weak-实例,并在处调用其方法以实现所需的行为:

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):

此时,当从
SaveViewController
返回时,应调用
SaveViewController
方法,包括
listary
作为参数


旁注:

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

var masterView:MasterViewController!
但是请记住,正如我前面提到的,这种方法仍然不合适。

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

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

根据中的“如何应用授权?”部分,我们应该做的第一件事是实施所需的协议:

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
中,您应该创建
SaveViewControllerDelegate
的-weak-实例,并在处调用其方法以实现所需的行为:

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):

此时,当从
SaveViewController
返回时,应调用
SaveViewController
方法,包括
listary
作为参数


旁注:

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

var masterView:MasterViewController!

但是请记住,正如我前面提到的,这种方法仍然是不合适的。

masterView
是一个普通的
UIViewController
,它不包含
列表数组。您应该使用第一个UIViewController的类型声明它。
masterView
是一个普通的
UIViewController
,它不包含
listArray
。您应该使用第一个UIViewController的类型声明它。ListArray旨在成为字符串数组的多维数组。我已经深入了解了这一点,我仍然在努力抓住代表,但我离他们越来越近了。你的回答确实帮了不少忙。我想我需要一两天的时间来理解整个概念。谢谢。@r405对于任何面临的问题,请毫不犹豫地提问:)我有几个问题。在SaveViewController类之后,将“UITableViewDelegate”作为参数。声明协议/委托时必须始终调用此函数吗?另外,我注意到协议是在主VC中声明的,我看到它的函数是在主VC中定义的,这对吗?我只是想彻底检查一下。非常感谢。哦,实际上这是一个错误,很抱歉:)答案已编辑。好的,再问一个问题。要将更新后的数组存储在主VC中,是否将其存储在协议中的变量中?或者你提供的功能已经可以在主VC中访问了吗?ThanksListArray旨在成为字符串数组的多维数组。我已经深入了解了这一点,我仍然在努力抓住代表,但我离他们越来越近了。你的回答确实帮了不少忙。我想我需要一两天的时间来理解整个概念。谢谢。@r405对于任何面临的问题,请毫不犹豫地提问:)我有几个问题。在SaveViewController类之后,将“UITableViewDelegate”作为参数。声明协议/委托时必须始终调用此函数吗?另外,我注意到协议是在主VC中声明的,我看到它的函数是在主VC中定义的,这对吗?我只是想彻底检查一下。非常感谢。哦,实际上这是一个错误,很抱歉:)答案已编辑。好的,就一个mo