UIKit - 导航控制器确实导航回来时的操作

Posted

技术标签:

【中文标题】UIKit - 导航控制器确实导航回来时的操作【英文标题】:UIKit - action when navigation controller did navigate back 【发布时间】:2016-03-14 15:12:38 【问题描述】:

这应该是绝对微不足道的,但我找不到任何东西:

我有一个带有导航控制器的简单故事板,我从一个名为“Bob”的视图控制器中推送一个视图控制器,我们称之为“Jane”。

所以当 Jane 在点击“返回”按钮后被解雇时,Bob 想做一些事情,如下所示:

- (IBAction) janeWasDismissed:(UIViewController *)jane

   // bob wants to ask what Jane did.

这是最简单的事情吧?但我想不通,肯定 Unwind Segues 不是正确的方法吗? 在Interface Builder中必须有一个简单的单击和拖动操作,或者在推送视图控制器弹出时调用的UIViewController上的方法?

谢谢!

【问题讨论】:

【参考方案1】:

实际上,这根本不是微不足道的。如果 Bob 需要 Jane 的信息,您需要安排 Jane 将该信息发送回 Bob。例如,在 Jane 的 viewWillDisappear: 中,她可以获得对 Bob 的引用(通过他们共享的导航控制器)并调用 Bob 中的某个方法。

您可能会反对(相当合理地)这意味着 Jane 了解 Bob 的班级。 那个的通常解决方案更加重要:Bob 在召唤 Jane 时,将自己作为 Jane 定义的协议的委托人提供给 Jane。因此,Jane 只需要知道 Bob 的一种方法——不是他的实际类,而是她自己在协议中指定的方法。

【讨论】:

嗯,有趣!我有点认为它应该是相反的:当 Bob 调用 Jane 时,Bob 已经认识 Jane。为什么简要提到鲍勃? 通常的架构是,Bob 在召唤 Jane 时,将自己作为 Jane 定义的协议作为委托提供给 Jane。因此,Jane 只需要知道 Bob 的一种方法——不是他的实际类,而是她自己在协议中指定的方法。 好的,谢谢 - 如果这是一个人所做的事情,我会这样做。看起来仍然很奇怪,因为模态控制器(警报控制器等)以相反的方式进行操作。另一方面,如果推送的 VC 需要从父 VC 中提取数据,我看到了这个模型的意义。 不,模态控制器(呈现的视图控制器)的工作方式相同。这是 A 创建 B 的标准架构,B 必须在信息不存在时将信息交还给 A。即使使用现代警报控制器,您仍在向 B(警报)传递一个指向 A 的闭包,而 B 必须调用它。 hm 是的,它只是在处理闭包块时看起来不同。好吧,其实我还是很困惑。如果我想在viewWillDisappear: 中向 Bob 发送消息,除了导航回 Bob 之外,我还需要处理 Jane 将消失的情况……挑剔:***.com/questions/5217992/…【参考方案2】:

在 Interface Builder 中没有简单的单击和拖动操作。

UIViewController 上没有在推送的视图控制器弹出时调用的方法。

JaneViewController 必须向 BobViewController 发出信号。

class BobViewcontroller 
    var janeWasDismissed = false

    override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)
        if janesWasDismissed 
            // Do something
            janeWasDismissed = false
        
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "go-to-jane" 
            let destinationController = segue.destinationViewController as! JaneViewController
            destinationController.delegate = self
            self.janeWasDismissed = false
        
    


class JaneViewController 
    var delegate: BobViewcontroller?

    func dismissJane() 
        if let delegate = delegate 
            delegate.janeWasDismissed = true
            self.navigationController?.popViewControllerAnimated(false)
        
    

【讨论】:

以上是关于UIKit - 导航控制器确实导航回来时的操作的主要内容,如果未能解决你的问题,请参考以下文章

如何从 xcode 故事板上的导航控制器导航回来

登录后 Facebook IOS SDK 导航到另一个控制器不起作用

UINavigation 控制器上的完成按钮没有导航回来

为所有 ViewController 自定义导航控制器

导航栏颜色不会变回来? IOS 7

如何将导航控制器添加到不是主视图的视图?