UITextFieldDelegate проблема - PullRequest
       1

UITextFieldDelegate проблема

0 голосов
/ 28 апреля 2011

У меня есть приложение для iPad, использующее протокол UITextFieldDelegate. Я заявляю и внедряю полный протокол. Поле, вызывающее этот протокол, объявляется следующим образом:

typingInput = [ [ [ UITextField alloc ] initWithFrame: textIn ] retain ];
dp.x = center.x;
dp.y = center.y - 42;
typingInput.center = dp;

[ self addSubview: typingInput ];
[ typingInput release ];

typingInput.font = [ UIFont systemFontOfSize: 52.0 ];
[ typingInput setTextColor: [ UIColor whiteColor ] ];
typingInput.backgroundColor = [ UIColor colorWithWhite: 0.0 alpha: 0.0 ];
typingInput.alpha = 0.0;
typingInput.userInteractionEnabled = NO;
[ typingInput addTarget: self action: @selector(textField:shouldChangeCharactersInRange:replacementString:) forControlEvents: UIControlEventEditingChanged | UIControlEventAllEditingEvents  ];
typingInput.text = @"";
typingInput.autocorrectionType = UITextAutocorrectionTypeNo;
typingInput.enablesReturnKeyAutomatically = YES;
typingInput.delegate = self;

Проблема с

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: (NSRange)qrange replacementString: (NSString *)str;

В симуляторе тип времени выполнения 'str' либо nil, либо NSCFString в соответствии с этим:

NSLog(@"class = %@, value='%@'", [ str class ], str );

Все отлично работает, когда я редактирую строку.

На iPad возвращается тот же оператор записи:

class = UIFieldEditor, value='<UIFieldEditor: 0xb5f400; frame = (0 0; 640 640); text = 'Foobar'; opaque = NO; layer = <UIWebLayer: 0x113ba0>>'

Последующее использование 'str' в качестве строки NSSt вызывает сбой на iPad, когда я пытаюсь добавить, изменить или удалить текст. qrange также недопустим (длина - какое-то огромное число).

UIFieldEditor является частью UIWebView.h, который я не использую.

В некоторой степени изменение объявления членов протокола влияет на поведение.

Поскольку я не могу найти кого-то еще с этой проблемой, я должен предположить, что я делаю что-то не так.

Есть идеи?

1 Ответ

1 голос
/ 29 апреля 2011

Метод делегата shouldChangeCharactersInRange будет автоматически вызываться UITextField (установив его свойство delegate). UITextField может также вызывать другие методы делегата, если вы их реализовали.

Вы не (и не должны) явно подключать методы делегата к событию UITextField, используя addTarget. Это приведет к тому, что метод делегата будет вызван дважды (один раз, как определено протоколом, а второй - вашим addTarget).

Путем (неправильного) подключения события UIControl к этому методу оно вызывается с параметрами, которые не совпадают с параметрами метода. Методы обработки событий UIControl (которых нет shouldChangeCharactersInRange) имеют следующие формы:

- (void)methodName;
- (void)methodName:(id)sender;
- (void)methodName:(id)sender withEvent:(UIEvent *)event;

Подробнее см. Цель какао и Лекция по разработке приложений для iPhone 4 .

Удалите строку addTarget для исправления.


Отдельно:
  • не устанавливает альфа на 0,0, делая элемент управления невидимым?
  • почему для userInteractionEnabled установлено значение NO?
  • явный вызов retain, вызов addSubView, вызов release, а затем установка свойств (даже если это работает) - это не обычный способ действий. Снимите удержание и переместите addSubView и отпустите его до конца.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...