【发布时间】:2009-10-30 16:44:57
【问题描述】:
我最近开始尝试在我的 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 属性,而是在我想要唤起customCallback 的STViewPicker 实现中执行以下操作:
if ( [ self.delegate respondsToSelector:@selector( customCallback ) ] )
{
[ self.delegate performSelector:@selector( customCallback ) ];
}
这很好用,但我真的很困惑为什么我原来的方法不起作用。
【问题讨论】:
标签: objective-c inheritance uikit protocols