iOS协议 - 代表始终为零

时间:2015-07-20 22:15:20

标签: ios objective-c delegates protocols

我有两个控制器。一个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的方法时调用子视图控制器中的方法(但仅限于某些子视图控制器,而不是全部)。

有什么建议吗?

4 个答案:

答案 0 :(得分:0)

请为名为delegate的属性实现自定义getter,正常设置并在那里设置断点。通过这种方式,您可以找到问题的原因。

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

答案 1 :(得分:0)

最可能的原因(以及一个非常常见的原因)是在BaseViewController之前调用了viewDidLoad方法。你确认这不是这种情况吗?

作为备注,您的意思是self放置在super的所有位置。

另请注意,在这一行:

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

没有理由self.myListener &&...如果self.myListenernil,则其余的通话将自动变为假。

答案 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;
}