将数据从模态 segue 传递给父级
Posted
技术标签:
【中文标题】将数据从模态 segue 传递给父级【英文标题】:Passing data from modal segue to parent 【发布时间】:2015-02-13 15:13:51 【问题描述】:我想将数据(例如 set var)从模态 segue 传递给父级,我该怎么做?
我正在使用该代码退出模态转场:
@IBAction func doneClicked(sender: AnyObject)
self.dismissViewControllerAnimated(true, completion: nil)
我不能在这里使用 segue.destinationViewController
来传递数据,就像我过去在 push segues 上所做的那样。
【问题讨论】:
【参考方案1】:在模态视图控制器上创建协议
protocol ModalViewControllerDelegate
func sendValue(var value : NSString)
同时在你的 Modal ViewController 类中声明
var delegate:ModalViewControllerDelegate!
在 ParentViewController 中包含这个协议 ModalViewControllerDelegate
当你从一个视图控制器移动到另一个视图控制器时
modalVC.delegate=self;
self.presentViewController(modalVC, animated: true, completion: nil)
您可以在 ParentViewcontroller 中获得您的价值
func sendValue(value: NSString)
终于在 ModalViewController 上
@IBAction func doneClicked(sender: AnyObject)
delegate?.sendValue("value")
self.dismissViewControllerAnimated(true, completion: nil)
【讨论】:
一个尼特,而不是“sendValue”,我会遵循苹果代表约定并使用类似modalView:finishedWithValue:
sendValue
的东西仍然将调用者和接收者捆绑在一起,而不是必要的。
给你发什么链接?对于 Apple 遵循的委托约定,只需查看它们提供的任何模态视图控制器,例如 UIImagePickerController
。
哦,我误解了我认为有更好的回调实现方法。你是对的 UIImagePickerController 例子是最好的。事实上,在 ios 中我们使用了很多回调,它可能使用委托 NSNotifcations、block、Selctor。这种问题可以通过任何回调方法来解决。我喜欢使用委托、协议。我尽量避免使用 NSNotifications【参考方案2】:
在第二个 viewController(segue 显示的那个)中声明一个变量,如
var parentVC : UIViewController?
那么当你从父级调用 segue 时
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if segue.identifier == "yourSegue"
let secondController= segue.destinationViewController as UIViewController
secondController.parentVC = self
所以你可以使用
@IBAction func doneClicked(sender: AnyObject)
self.parentVC.yourVariable = 0
self.dismissViewControllerAnimated(true, completion: nil)
【讨论】:
真的不应该直接在其他视图控制器中胡闹,那样是疯狂的。如果你不对调用者做出假设,你也会获得很大的灵活性。遵循UIKit
设置的标准模型并在完成时使用委托和/或回调要好得多。见Shashi's answer。以上是关于将数据从模态 segue 传递给父级的主要内容,如果未能解决你的问题,请参考以下文章
使用委托将数据从模态视图传递到父视图(在情节提要中使用 segue)
如何在角度 4 中使用 ng-bootstrap 将数据模态组件传递给父组件