我有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将数据传回视图控制器层次结构。
您也可以尝试一下。

使用通知:
  • 步骤1:在VC1中:注册以获取通知。override func viewDidLoad() { NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("myFunc:"), name: "SomeName", object: nil) } func myFunc(theNotifiction : NSNotification){ print("I got notified (theNotifiction.userInfo!)") }
  • 步骤2:在VC2中:在适当的时间发布通知。NSNotificationCenter.defaultCenter().postNotificationName("SomeName", object: nil, userInfo: ["theKey":"theData"])
  • 关于ios - iOS使用presentModalSegue将数据从viewController2传递回viewController 1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33748950/

    10-10 21:12