我最近开始尝试在我的Objective-C开发中使用协议,作为(更明显的)在我的类中更适当地委托任务的方式。我完全理解协议的基本概念及其工作原理。然而,当我尝试创建一个自定义协议并转而实现另一个协议时,我碰到了一个障碍。我自从发现了解决方案,但我很好奇,为什么下面不工作:协议内的Objective-C协议
@protocol STPickerViewDelegate <UIPickerViewDelegate>
- (void)customCallback;
@end
@interface STPickerView : UIPickerView
{
id <STPickerViewDelegate> delegate;
}
@property (nonatomic, assign) id <STPickerViewDelegate> delegate;
@end
在一个视图控制器,符合
STPickerViewDelegate
然后:
STPickerView * pickerView = [ [ STPickerView alloc ] init ];
pickerView.delegate = self;
- (void)customCallback
{
...
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
...
}
的问题是,pickerView:titleForRow:forComponent:
从未被调用。另一方面,customCallback
被称为很好,这并不令人感到意外。我不明白为什么STPickerViewDelegate
本身符合UIPickerViewDelegate
,当UIPickerViewDelegate
的事件应该发生时,不会通知我的视图控制器。根据我对Apple文档的理解,如果协议(A)本身符合另一个协议(B),那么符合第一协议(A)的类(C)也必须符合第二协议(B),即正是我想要的和期望的行为。
我最终什么事做的是去除STViewPicker
的id<STPickerViewDelegate> delegate
财产,而不是做这样的事情在我的STViewPicker
执行以下命令,其中我想唤起customCallback
:
if ([ self.delegate respondsToSelector:@selector(customCallback) ])
{
[ self.delegate performSelector:@selector(customCallback) ];
}
这只是正常的,但我真的很对于我原来的方法不起作用感到困惑。
的答案是如此明显,一旦有人点出来,是吗? :)我想我的大脑真的很累。是的,我们的母亲恋人必须坚持在一起。 :d – LucasTizma 2009-10-30 20:56:34