2013-03-21 119 views
0

我相信这是非常基本的,但我一直无法找到任何有关它。设置代理

我有一个viewController女巫有一个模式segue到一个导航控制器与一堆表单工作表viewControllers。像这样:

的viewController A ---(模态赛格瑞)---> navigationController --->的viewController乙--->的viewControllerÇ

在CI的viewController取得委托,像这样:

@protocol ViewControllerCDelegate <NSObject> 
- (void)myMehtod; 
@end 

@interface ViewControllerC : UIViewController 

@property (nonatomic, assign) id <ViewControllerCDelegate> myDelegate; 

(我已经合成myDelegate)

我想设置myDelegate是A.的viewController我的问题是,在这里?我该怎么办?

我试图以这一个的viewController的viewDidLoad中:

ViewControllerC *delegateController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerC"]; 
delegateController.myDelegate = self; 

但委托不出现才能完成设置。想法?

+1

你确定'delegateController'实际上正在被实例化吗?你是否坚持在某个地方的参考? – 2013-03-21 18:04:22

+0

您确定您在上述代码段中引用的ViewControllerC实例是最终实际使用的吗?也就是说,你没有在别处实例化相同的视图控制器? – 2013-03-21 18:07:36

+0

您应该在ViewControllerC出现时设置委托,而不是在ViewControllerA出现时进行设置。而且你不需要综合myDelegate。 – AMayes 2013-03-21 18:08:35

回答

0

当您执行instantiateViewController时,您正在创建一个新的 ViewControllerA。如果你想要现有的ViewControllerA,你需要将它传递给控制器​​链。如果这变得有问题,您可以在应用程序委托上创建一个属性来存储它。在哲学上,有些人可能反对使用应用程序委托作为全局变量交换所,但它可能比将指针向下传递到4级视图控制器更清洁。你确定在这种情况下你需要委托模式吗?也许NSNotificationCenter将是一个更清洁的选择?

+0

有意义。但是,你能给我一个访问viewController的例子吗? – Michael 2013-03-21 18:42:08

+0

您像访问其他实例变量或属性一样访问它。既然你有“B”的方式,你可以在B上创建一个属性来保存对A的引用,然后将它传递给C.所以你应该在从A到B的prepareForSegue中这样做。然后当B创建C,将A的引用粘贴到C中。当B并不真正需要对A的引用时,除了将其传递外,这种说法有点笨拙。这就是为什么我认为另一种设计可能更清洁。不知道你需要C来与A沟通,但很难说。也许你真的需要一个独立的数据模型,A&C都观察? – jsd 2013-03-21 22:14:40