Ios 容器视图控制器与ChildViewController的通信

Ios 容器视图控制器与ChildViewController的通信,ios,cocoa-touch,uiviewcontroller,delegates,Ios,Cocoa Touch,Uiviewcontroller,Delegates,我有一个包含3个子UIViewController子类(添加了addChildViewController)的容器视图控制器。我希望我的一个子视图控制器在从容器视图控制器中删除某个对象时执行某些操作。我很难理解这种交流应该如何进行。如果我尝试进行委托,我的子视图控制器中会出现错误,因为我希望两个子类都能相互导入。您不能直接执行以下操作: MyChildViewController *myChildViewController = (MyChildViewController *)[self.ch

我有一个包含3个子UIViewController子类(添加了addChildViewController)的容器视图控制器。我希望我的一个子视图控制器在从容器视图控制器中删除某个对象时执行某些操作。我很难理解这种交流应该如何进行。如果我尝试进行委托,我的子视图控制器中会出现错误,因为我希望两个子类都能相互导入。

您不能直接执行以下操作:

MyChildViewController *myChildViewController = (MyChildViewController *)[self.childViewControllers objectAtIndex:0];
[myChildViewController doWhatever];
??
这样,您就可以在数组ChildViewController(UIViewController上的一个属性)的第一个索引处向子视图控制器发送消息。

听起来您在编译应用程序时遇到了问题,因为相互的.h文件
相互导入
,对吗

编辑:再次阅读您的问题后,我不完全清楚哪个视图控制器需要调用另一个视图控制器。如果我弄错了 父视图控制器和子视图控制器在我的解决方案中的角色,只需切换 他们。下面的技术允许您在任意两个视图之间进行通信 控制器(父级和子级、同级和同级等)

有很多方法可以解决这个问题。如果您想继续使用
委托
模式,可以简单地重写标题,以避免在其中一个.h文件中出现
#import

ParentViewController.h:

#import "ChildViewController.h"

@interface ParentViewController: UIViewController {
@private
   ChildViewController* childVc;
}

- (void) doSomething;
ChildViewController.h

@class ParentViewController;   // NOT #import!

@interface ChildViewController: UIViewController {
@private
   ParentViewController* parentVc;
}
#import "MyProtocol.h"

@interface ChildViewController: UIViewController {
@private
   id<MyProtocol> delegate;
}

@property (nonatomic, assign) id<MyProtocol> delegate;
ChildViewController.m

#import "ParentViewController.h"
这应该可以避免循环依赖,因为循环依赖会阻止应用程序编译

现在,尽管上述方法有效,但为了清洁起见,我可能会选择另一种解决方案。使用
协议
。父级可以实现协议,然后子级只需要有一个实现协议的委托:

#import "MyProtocol.h"

@interface ParentViewController: UIViewController<MyProtocol> {

}

- (void) doSomething;
然后在ChildViewController.h中

@class ParentViewController;   // NOT #import!

@interface ChildViewController: UIViewController {
@private
   ParentViewController* parentVc;
}
#import "MyProtocol.h"

@interface ChildViewController: UIViewController {
@private
   id<MyProtocol> delegate;
}

@property (nonatomic, assign) id<MyProtocol> delegate;
或者,您可以避免完全使用委托,这会使它们稍微解耦,并避免编译器的循环性(双向依赖性)


我可以,但我看不出这与简单地定义嵌套视图控制器并使用它们有多大不同。如果这不违反任何设计规则,我将非常乐意实现这种方法。我实际上不能说是最佳实践。我同意在这里使用协议。子级永远不应该有对父级的引用。但是,这不是使用NSNotificationCenter的合适位置。您可以使用它向许多对象广播消息,而不仅仅是容器中的父对象。授权是正确的解决办法。