繁体   English   中英

如何将数据传递回堆栈中的视图控制器?

[英]How Pass Data back a view controller in the stack?

我已经在这个类别中看到了很多问题,但是它们似乎都以相同的方式回答,这只是在视图控制器之间传递数据,这并不是我想要的。

我有在其中存储数据的VC1,在特定情况下,用户需要在VC2中获取全部信息。 我需要将该信息传递回VC1,称为数据“ info”

我希望使用的代码是这样的。 我访问VC堆栈,并将变量分配给可选的“ info”变量(在编译时,堆栈不知道VC类型是堆栈中的哪种类型。

let nav = self.navigationController
let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1]
****//code that isn't working
nextView.info = self.info => Value of type 'UIViewController?' has no member 'info'

****//This works fine
nav?.popViewController(animated: true)

你需要投

if let let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1] as? VCName {
   nextView.info = self.info
}

假设您处于导航堆栈中,并且位于您下方的视图控制器就是您要与之交谈的视图控制器,这是脆弱的。

我的猜测是以前的视图控制器推动了您的工作,并为您提供了您正在编辑的数据。

在两个视图控制器之间设置一个委托协议,并在推送之前让自己成为新的视图控制器的委托,这样会更好/更清洁。 然后它将只向其委托发送一条消息以将数据传回。

nextView被认为是它的超类UIViewController因为UINavigationController viewControllers数组是这样定义的( [UIViewController] )。

如果您的VC1是FirstVC类型( UIViewController子类),则应将其FirstVC为它的实际类,以便“看到”您的其他属性。 下一个视图控制器也是如此。 那么,如果执行此操作会怎样?

let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1] as? SecondVC

当然,假设您的nextViewSecondVC类。 请记住,面向对象的编程具有多态性 ,在这种情况下,所有视图控制器都是UIViewController后代,因此,它们通常UIViewController在这种情况下可能会发生。

无论如何,正确的方法是定义一个协议,使FirstVC符合该协议,将第一视图控制器作为参数传递给SecondVC ,然后在第二视图控制器中,当选择一个协议时,将协议方法返回给第一视图控制器。选项。 就像是:

protocol PassDataBackProtocol {
    var result: String
}

class FirstVC: UIViewController, PassDataBackProtocol {
    var result: String = "" {
        didSet {
            // Update your view
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let secondVC = segue.destination as? SecondVC {
            secondVC.firstVC = self
        }
    }
}

class SecondVC: UIViewController {
    weak var firstVC: PassDataBackProtocol?

    func didChangeValue(newValue: String) {
        firstVC?.result = newValue
        navigationController?.popViewController(animated: true)
    }
}

如果您使用的是pushViewController(_:animated:)而不是segues, firstVC在执行推送之前设置firstVC

编辑:我将weak属性添加到后指针,因为避免保留子弹很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM