2014-04-26 86 views
0

我有一個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)

+0

但看來Xcode中不喜歡你來聲明都有自己的代表的子類。要麼讓他們成爲兩個不同的類,其中一個不繼承另一個,或者將它們放在一個類中。 – davidethell

回答

1

您是否確定在聲明時指明委託符合哪個協議?

例如:

@interface ManualTimer : Timer 
    @property (weak, nonatomic) id<ManualTimerDelegate> delegate; 
@end 
+0

這是問題所在。我在發帖之前花了大約一個小時看代碼,並沒有注意到這一點。 – BrainLikeADullPencil

1

是的,你可以定義新子協議,並添加符合新協議的屬性。

您需要發佈Timer和ManualTimer的整個頭文件。你不顯示任何一個類的接口的內容。

它看起來像ManualTimer是Timer的子類?正確?

尷尬的是,類和子類都有一個委託屬性,並且這兩個委託屬性符合不同的協議。一個子類需要完全實現其超類的所有行爲。因此,您的ManualTimer類的委託屬性應該符合TimerDelegate和ManualTimerDelegate協議。

相關問題