8

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

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

或者

我需要去子类化....谢谢....

4

4 回答 4

10

在父视图控制器和子视图控制器之间进行通信有很多选项:

  1. 父母 -> 孩子

    • 直接交互:父级中有实例
  2. 孩子 -> 父母

    • 代表团[首选]
    • 通知
    • 通过数据库、Plist 文件等传递值。
    • 存储在应用委托实例中并传递值 ( UIApplicationDelegate)
    • NSUserDefaults

优秀的详细解释

于 2013-06-17T09:39:46.047 回答
5

如果你只是想在你的子视图控制器上调用一个方法,你可以使用:

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

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

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

于 2013-06-17T09:39:29.340 回答
2

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

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

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

于 2013-06-17T09:31:46.960 回答
0

您可以从父视图控制器覆盖prepare segue,并像这样与您的孩子交谈:

    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)并查找标识符标签。

于 2020-08-15T03:06:59.033 回答