父视图控制器和子视图控制器之间通信的更好方法是什么?

时间:2013-06-17 09:25:31

标签: iphone ios objective-c cocoa-touch uiviewcontroller

这可能是一种简单的方法,但我需要那些熟悉iOS的人的指导。

如果父视图控制器想要向所有子视图控制器发送一个特定的消息,那么最好的方法是什么?,现在我已经在每个子视图控制器中编写了一个方法,并在必要时通知我,在我希望的情况下通知所有孩子?我该怎么办?我不认为我需要在所有ViewControllers中编写相同的方法..

我是否需要进行子类化....谢谢......

4 个答案:

答案 0 :(得分:8)

与父子ViewControllers进行通信,有很多选项

父母 - >子

  • 直接互动,实例在父母

儿童安全>父

  • 委托[最受欢迎]
  • 通知
  • 通过数据库,Plist文件等传递值
  • 存储在appdelegate实例中并传递值[uiapplicationdelegate]
  • NSUserDefaults的

A most excellent detailed explanation

答案 1 :(得分:4)

如果您只想在子视图控制器上调用方法,可以使用:

[[self childViewControllers] makeObjectsPerformSelector:@selector(nameOfSelector:) withObject:objectToSend];

或将对象与选择器一起传递的其他方法之一。

正如@Gianluca Tranchedone建议的那样,您可以使用委托或观察者模式,但这实际上取决于您需要做什么以及您的代码的结构。使父视图控制器符合子视图控制器的代理将允许您以更清晰的方式构建代码。

答案 2 :(得分:2)

使用委托模式。您可以指定一些希望代理作为协议实现的方法,并让父视图控制器实现协议。您的子视图控制器可以有一个名为'delegate'的属性'id',其中MyDelegateProtocol是您指定的协议。然后,当您希望子视图控制器与父级通信时,您可以调用协议中指定的方法。例如,如果您的协议指定了一个名为“myMethod”的方法,则在您的子视图控制器中,您可以调用[self.delegate myMethod]

使用这种方法,您可以让您的孩子向父母询问信息。如果您想通知孩子已发生的事情,您最好使用通知(NSNotification)或让您的孩子查看控制器以观察其父母的某些属性。

查看Apple发布的名为Working With Protocols的指南,了解有关如何使用它们的更多信息。

答案 3 :(得分:0)

您可以覆盖来自父视图控制器的准备工作,并像这样与您的孩子交谈:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ToServiceController" {
            //ToServiceController is your first child
            secondVC = segue.destination as? ServiceDirectVC
        }else if segue.identifier == "ToMapController" {
            //ToMapController is your second child
            let destVC = segue.destination as! MapVC
            destVC.delegate = self  //This is how you can access your child's local variables
        }
    }

标识符在情节提要中定义。单击箭头(segues)并查找标识符标签。