Одна стратегия для изучения здесь - переопределить метод setDelegate: а затем выполнить некоторую пересылку сообщений. Вы можете использовать [super setDelegate: self]
, чтобы убедиться, что ваши вызовы получают первые сообщения в сообщениях делегатов. В вашем переопределении setDelegate: установите внутренний ivar, например.
- (void) setDelegate: (id<UITextFieldDelegate>) internalDelegate;
{
[setInternalDelegate: internalDelegate];
}
Тогда для каждого из методов делегата UITextField сделать вещь перед пересылкой на сообщение делегата, например,
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
// do your thing with range and replacement string
// now forward message on the 'other' delegate
[[self internalDelegate] textField: self shouldChangeCharactersInRange: range replacementString: string];
}
Как правило, вы хотите, чтобы переопределить все методы делегата, даже если для большинства из них все, что вы делаете это прямо вперед.
Обновление Вы отмечаете в комментариях, что подход пересылки поднимает проблемы. Если это так, то традиционная делегация - это путь. (И вообще, это - путь - хотя я использовал делегат пересылки один или два раза, я не уверен, если бы с задним числом это было абсолютно необходимо, и я не проверял, «ве сделал это с UITextField. @Scott Corscadden имеет и не рекомендуется.)
наиболее распространенный шаблон, чтобы сделать ViewController, который выглядит после представления, в котором UITextField
является подтаблицей делегата. Вы не говорите в своем ответе, если есть особая причина, по которой вам нужно работать с подклассом. Если вы упаковываете интересные вещи в UITextField
, это может быть, хотя вы всегда можете предложить другой плакат и создать сопутствующий класс для UITextField
, который будет работать и использовать это как делегат. В любом случае, если нужно, вы всегда можете заставить объект делегата вызвать дополнительные методы в вашем подклассе UITextField
, например.
// in the delegate object class
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
[delegate doSomeExtraThingInTheTextFieldSubclassThatItSeemsToMakeSenseToDoThereRatherThanHere];
// maybe that's it, or maybe this object also wants to do something here...
}
Можете ли вы уточнить? Не сразу понятно, почему вы не будете использовать textField: shouldChangeCharactersInRange :, то есть получите подкласс, чтобы установить его экземпляры в качестве своих собственных делегатов. – Obliquely
Единственная проблема с настройкой его как собственного делегата - это пересылка событий фактическому делегату, который может захотеть ответить на события UITextField. В настоящее время я использую addTarget: action: forControlEvent: чтобы реагировать на эти события внутри себя. –