如何将数据传递给嵌套控制器(UIContainerView)?

Posted

技术标签:

【中文标题】如何将数据传递给嵌套控制器(UIContainerView)?【英文标题】:How to pass a data to a nested controller (UIContainerView)? 【发布时间】:2015-09-12 13:33:04 【问题描述】:

我到处寻找解决方案,但一无所获。我有两个视图控制器,我想将数据从 viewController.swift 传递给 resultViewController.swift (容器视图),当我运行它时我已经成功发送数据。但是当我点击增加按钮时,我无法再次发送数据。

ViewController.swift:

class ViewController: UIViewController 

    var result: Int = 1

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
       // performSegueWithIdentifier("sendResult", sender: <#AnyObject?#>)
    

    @IBAction func increas(sender: AnyObject) 
        result++
        performSegueWithIdentifier("sendResult", sender: self)

    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "sendResult"
        var resultVC = segue.destinationViewController as! ResultViewController
        resultVC.result = self.result
        
    

ResultViewController.swift:

class ResultViewController: UIViewController 

    var result: Int!

    @IBOutlet weak var resultLabel: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        resultLabel.text = "\(result)"
    

【问题讨论】:

你想做什么?将result 发送到ResultViewController?您是否尝试在 ViewController 中再次更新它,然后使用 segue 传递值?你希望发生什么? 我添加了一个按钮,操作名为增加 它在视图控件中,它确实增加了结果值并将其发送到容器视图(ResultViewController。我不知道如何传递它。 是的,我可以看到。但是你说是送的? 这就是重点。我想通过 segue(emed segue)发送它。我尝试使用标识符执行 segue 但没有工作 【参考方案1】:

好的。这是一些工作代码。

首先,删除您的增加方法并将其从连接检查器中的按钮上解开。然后在 Interface Builder 中删除旧的 segue,并通过从按钮拖动到 ResultsViewController 创建一个新的 segue。确保在 Interface Builder 中给 segue 一个“sendResult”标识符。在ViewController:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "sendResult" 
        result++
        var rvc = segue.destinationViewController as! ResultViewController
        rvc.result = result
    

然后在ResultsViewController:

@IBOutlet weak var resultLabel: UILabel!
var result : Int = 0

override func viewDidLoad() 
    super.viewDidLoad()
    resultLabel.text = "\(result)"

    // Do any additional setup after loading the view.

【讨论】:

当我删除嵌入的segue时,resultViewController不会出现在container view中。 要重新添加吗? 当然我会看看。该项目不包含ResultViewController 或对默认情节提要的任何修改。这是正确的项目吗?【参考方案2】:

嵌套的 ViewController 使用起来有点棘手,因为从父控制器的角度来看,它们所看到的只是一个 UIView(没有 rootViewControllernestedViewController 属性,这将是非常好的)。

我发现向嵌套控制器发送/读取数据的最佳方法是在父控制器上添加对它的引用。

事实证明,prepareForSegue 是在所有嵌套视图控制器的 viewDidLoad 之后调用的。然后它再也不会被调用,除非你手动调用它。但你不应该也不需要这样做。

您可以通过以下方式获取对嵌套控制器的引用,以便稍后在您的代码中使用:

class ViewController: UIViewController 

    var result: Int = 1
    private var resultVC: ResultViewController?  // Keep it optional

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    

    @IBAction func increas(sender: AnyObject) 
        result++
        // Update result value, keep optional reference for security
        // Here you could write & read values, call methods, etc.
        resultVC?.result = result
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "sendResult" 
          // Save reference to child view controller (use optional)
          resultVC = segue.destinationViewController as? ResultViewController
        
    

一旦你有了对嵌套视图控制器的引用,你就可以在代码的任何地方使用它。为了安全起见,请始终将其与 ? 一起使用。

【讨论】:

这是我的项目以了解我的情况github.com/d7oomalmalki/ContainerView 我需要使增加按钮起作用。 链接似乎不起作用,我假设您的项目是私有的。你试过我分享的代码吗?你有什么错误吗?

以上是关于如何将数据传递给嵌套控制器(UIContainerView)?的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework:如何将数据传递给嵌套的序列化器并仅在自定义验证后创建对象

如何将数据传递给其他视图? [关闭]

单击注释时,如何将数据传递给其视图控制器?

重新加载后如何将数据传递给局部视图

如何使用json将数据传递给ajax函数?

Ios:如何将数据传递给 UISplitViewController?