如何将数据传递给嵌套控制器(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
(没有 rootViewController
或 nestedViewController
属性,这将是非常好的)。
我发现向嵌套控制器发送/读取数据的最佳方法是在父控制器上添加对它的引用。
事实证明,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)?的主要内容,如果未能解决你的问题,请参考以下文章