Я недавно начал пробовать свои силы в использовании протоколов в моей разработке 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), то класс (C), который соответствует первому протоколу (A), должен также соответствовать второму протоколу (B), который именно то поведение, которое я хочу и ожидал.
В итоге я удалил свойство id< STPickerViewDelegate > delegate
из STViewPicker
и вместо этого сделал что-то подобное в моей реализации STViewPicker
, где я хочу вызвать customCallback
:
if ( [ self.delegate respondsToSelector:@selector( customCallback ) ] )
{
[ self.delegate performSelector:@selector( customCallback ) ];
}
Это прекрасно работает, но я действительно озадачен, почему мой оригинальный подход не сработал.