Одна из стратегий, которую мы рассмотрим здесь, - переопределить метод 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. @ Скотт Корскадден имеет и не рекомендует его.)
Самым распространенным шаблоном является создание 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...
}