iOS协议 - 代表始终为零

问题描述 投票:-1回答:4

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

有什么建议?

ios objective-c delegates protocols
4个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.