我有一個viewController實現兩個委託,每個方法。子類可以從父類創建不同的協議嗎?
@interface scViewController : UIViewController <TimerDelegate, ManualTimerDelegate>
- (void) updateTimerLabels:(NSString *) sender; //from TimerDelegate
- (void) updateManualTimerLabel:(NSString *) sender; //from ManualTimerDelegate
在的viewController,我對他們倆的委託設置爲self
-(Timer *)timer
{
if (!_timer) {
_timer = [[Timer alloc] init];
_timer.delegate = self;
}
return _timer;
}
-(ManualTimer *)manualTimer
{
if (!_manualTimer) {
_manualTimer = [[ManualTimer alloc] init];
_manualTimer.delegate = self;
NSLog(@"%@ ", _manualTimer.delegate);
}
return _manualTimer;
}
這是我如何創建Timer類和它的子類ManualTimer雙方協議
@class Timer;
@protocol TimerDelegate <NSObject>
-(void)updateTimerLabels:(NSString *)timer;
@end
ManualTimer.h
#import "Timer.h"
@class ManualTimer;
@protocol ManualTimerDelegate <NSObject>
-(void)updateManualTimerLabel:(NSString *)timer;
@end
@interface ManualTimer : Timer
以下是的viewController
- (void) updateTimerLabels:(NSString *) sender {
....
}
- (void) updateManualTimerLabel:(NSString *) sender {
....
}
實現的兩種方法然而,如果我嘗試,從ManualTimer類中的方法,來調用委託的委託方法(即在的viewController)時,Xcode告訴我,有一個爲沒有已知的實例方法是
[self.delegate updateManualTimerLabel:self.time];
但是定時器的委託方法正常工作,無論我把它從定時器的實例中,或從ManualTimer
的實例中[self.delegate updateTimerLabels:self.time]; // ok
最後,如果我從ManualTimer代表的方法,並在定時器委託
@protocol TimerDelegate <NSObject>
-(void)updateTimerLabels:(NSString *)timer;
-(void)updateManualTimerLabel:(NSString *)timer; //formally in manualTimer
聲明它然後Xcode的錯誤消失,我可以在c所有它來自ManualTimer或Timer的實例。
問題:子類是否可以不創建新的協議,或者爲什麼我在子類協議中聲明的方法不能被xCode識別,但是如果我在父協議中聲明瞭可以調用的相同方法它來自父類的實例還是子類?
而當我把定時器協議的一切代碼工作,它沒有任何意義把一個方法那裏,只與定時器的一個子類(即ManualTimer)
但看來Xcode中不喜歡你來聲明都有自己的代表的子類。要麼讓他們成爲兩個不同的類,其中一個不繼承另一個,或者將它們放在一個類中。 – davidethell