我有viewController1对我的viewController2进行模态选择,但是
viewController2嵌入在导航控制器上
因为我在那里需要导航栏。
我已经实现了一个协议,将数据从viewController2发送回viewController1,但是它不起作用。这是我的代码:
protocol writeValueBackDelegate {
func writeValueBack(value: String)
}
class viewController1: UITableViewController, writeValueBackDelegate {
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SelectAddress"{
if let dest = segue.destinationViewController as? MapAddressViewController{
dest.delegate = self
}
}
}
}
在viewController2上我有这个:
class viewController2: UIViewController{
var delegate: writeValueBackDelegate?
@IBAction func TaskOneClick(sender: AnyObject) {
delegate?.writeValueBack(txtAddress!.text!)
self.navigationController?.popViewControllerAnimated(true)
}
}
我不知道为什么,但是只有当我从secondviewController中移除导航控制器并直接将其从viewController 1切换到viewController 2时,它才起作用,但是我需要导航控制器来显示导航栏。
你知道为什么会这样吗?还是为什么我做得不好。
最佳答案
这是我对您的设置的理解。
ViewController1-> NavigationController-> ViewController2
在这种情况下,在“准备segue”方法中,目标视图控制器是“导航控制器”而不是“ViewController2”。
因此,这行代码将不正确。
if let dest = segue.destinationViewController as? MapAddressViewController{
dest.delegate = self
}
您在那里进行的向下转换将失败,因为目标VC不是MapAddressViewContoller,而是其UINavigation控制器。
要解决此问题,您可以更改代码,如下所示:
if let dest = segue.destinationViewController as? UINavigationController{
dest.rootViewController.delegate = self
}
但是,我更喜欢使用NSNotification将数据传回视图控制器层次结构。
您也可以尝试一下。
使用通知:
override func viewDidLoad() { NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("myFunc:"), name: "SomeName", object: nil) } func myFunc(theNotifiction : NSNotification){ print("I got notified (theNotifiction.userInfo!)") }
NSNotificationCenter.defaultCenter().postNotificationName("SomeName", object: nil, userInfo: ["theKey":"theData"])
关于ios - iOS使用presentModalSegue将数据从viewController2传递回viewController 1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33748950/