2015-07-20 116 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; 
}