2015-07-20 198 views
0

我有两个控制器。一个BaseViewController和MyController。在BaseViewController我有物业,有一个协议iOS协议 - 委托始终为零

BaseViewController.h

@property (nonatomic, strong) MyListener *myListener; 

MyListener.h

@protocol MyListenerProtocol; 

@interface MyListener : NSObject 

@property (nonatomic, weak) id<MyListenerProtocol> delegate; 

@end 


@protocol MyListenerProtocol; 


@protocol MyListenerProtocol <NSObject> 

@optional 
-(void) myMethod: (int) input; 

@end 

延伸myController的BaseViewController

@interface MyController : BaseViewController <MyListener> 

,并在它的viewDidLoad一个NSObject :

super.myListener = [[MyListener alloc] init]; 
super.myListener.delegate = self; 

在BaseViewController的方法,调用时它的作用:

if (self.myListener && [self.myListener.delegate respondsToSelector:@selector(myMethod:)]) { 
      [self.myListener.delegate myMethod: input]; 
     } 

但在这一点上, “self.myListener” 始终是零。

我想要的是在调用BaseViewController的方法时调用子视图控制器中的方法(但仅适用于某些子视图控制器,而不是全部)。

有什么建议吗?

+0

你确定它是相同的'MyListener'实例吗? – rmaddy

+1

为什么“超级”而不是“自我”? – vikingosegundo

+0

@vikingosegundo我用两种测试,“超级”是我最后的尝试。没有运气。 – Panos

回答

0

请为名为delegate的属性实现一个自定义getter,并正常设置它并在那里设置一个断点。这样你会发现问题的原因。

另外,请注意,只要没有其他物体指向您设置为委托的对象 ,弱财产就会消失。

0

最可能的原因(和一个疯狂的常见原因)是您的BaseViewController方法在viewDidLoad之前被调用。你有没有证实这不是这种情况?

作为说明,您的意思是self在您放置的所有地方super

还要注意,在这一行:

if (self.myListener && [self.myListener.delegate respondsToSelector:@selector(myMethod:)]) { 

没有理由self.myListener &&...如果self.myListenernil,呼叫的其余部分将自动变成假的。

0

你应该告诉MyController它使用的委托,但是你告诉错误的名字。

@interface MyController : BaseViewController <MyListener> 

变化:

@interface MyController : BaseViewController <MyListenerProtocol> 
0

集代表在prepareForSegue方法。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    LastNameViewController *lastNameViewController = [segue destinationViewController]; 
    lastNameViewController.delegate = self; 
}