我有两个控制器。一个BaseViewController和MyController。在BaseViewController上,我将NSObject作为属性,具有协议
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:
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 :(得分:0)
请为名为delegate的属性实现自定义getter,正常设置并在那里设置断点。通过这种方式,您可以找到问题的原因。
另外,请注意,只要没有其他对象指向,弱势属性就会消失 您设置为委托的对象。
答案 1 :(得分:0)
最可能的原因(以及一个非常常见的原因)是在BaseViewController
之前调用了viewDidLoad
方法。你确认这不是这种情况吗?
作为备注,您的意思是self
放置在super
的所有位置。
另请注意,在这一行:
if (self.myListener && [self.myListener.delegate respondsToSelector:@selector(myMethod:)]) {
没有理由self.myListener &&...
如果self.myListener
为nil
,则其余的通话将自动变为假。
答案 2 :(得分:0)
你应该告诉MyController它使用的委托,但是你说错了名字。
@interface MyController : BaseViewController <MyListener>
更改为:
@interface MyController : BaseViewController <MyListenerProtocol>
答案 3 :(得分:0)
在prepareForSegue
方法中设置委托。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
LastNameViewController *lastNameViewController = [segue destinationViewController];
lastNameViewController.delegate = self;
}