我有一个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];
但是,Timer委托方法工作正常,无论是从Timer实例中调用它,还是从ManualTimer实例中调用
[self.delegate updateTimerLabels:self.time]; // ok
最后,如果我从ManualTimer委托中获取该方法并在Timer委托中声明它
@protocol TimerDelegate <NSObject>
-(void)updateTimerLabels:(NSString *)timer;
-(void)updateManualTimerLabel:(NSString *)timer; //formally in manualTimer
然后xCode错误就消失了,我可以从ManualTimer或Timer的实例中调用它。
问题:子类是否可以不创建新协议,或者为什么我在子类协议中声明的方法不被xCode识别,但是如果我在父协议中声明了我可以称之为的相同方法来自父实例还是子类?
当我把所有内容都放在Timer协议中时代码有效,但在那里放一个只涉及Timer子类的方法(即ManualTimer)是没有意义的
答案 0 :(得分:1)
是的,您可以在子类中定义新协议,并添加符合该新协议的属性。
您需要发布Timer和ManualTimer的整个标头。您不会显示任何一个类的界面内容。
看起来ManualTimer是Timer的子类?正确的吗?
类和子类都有委托属性,并且2个委托属性符合不同的协议,这很尴尬。子类需要完全实现它的超类的所有行为。因此,您的ManualTimer类的委托属性应该符合TimerDelegate和ManualTimerDelegate协议。
答案 1 :(得分:1)
您是否确定在声明时指示代理符合的协议?
例如:
@interface ManualTimer : Timer
@property (weak, nonatomic) id<ManualTimerDelegate> delegate;
@end