Кнопки UISegmentedControl перестают работать
В моем приложении для iOS есть форма с дюжиной полей, и я хотел добавить кнопки "Предыдущий"/"Далее" над клавиатурой, чтобы пользователи могли перемещаться между полями. У меня есть что-то вроде этого:
for (UITextField *t in _textfields) {
t.delegate = self;
UIToolbar *toolbar = [[UIToolbar alloc] init];
[toolbar setBarStyle:UIBarStyleBlackTranslucent];
UISegmentedControl *segControl = [[UISegmentedControl alloc] initWithItems:@[@"Previous", @"Next"]];
[segControl addTarget:self action:@selector(switchTextField:) forControlEvents:UIControlEventValueChanged];
segControl.segmentedControlStyle = UISegmentedControlStyleBar;
segControl.tag = [_textfields indexOfObject:t];
if (segControl.tag == 0) [segControl setEnabled:NO forSegmentAtIndex:0];
else if (segControl.tag == [_textfields count] - 1) [segControl setEnabled:NO forSegmentAtIndex:1];
[segControl sizeToFit];
UIBarButtonItem *segItem = [[UIBarButtonItem alloc] initWithCustomView:segControl];
UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.view action:@selector(endEditing:)];
[toolbar setItems:@[segItem, flexButton, doneButton]];
[toolbar sizeToFit];
[t setInputAccessoryView:toolbar];
}
У меня проблема в том, что часто один из сегментов перестает работать. Метод switchTextField
просто не вызывается, кнопка выглядит нормально, не отключена, но касания не регистрируются. Иногда это "предыдущая" кнопка, иногда "следующая", никогда не одновременно, и иногда они оба работают нормально. Как только одна из кнопок застрянет, единственный способ (временно) исправить это - нажать на другое текстовое поле без использования панели инструментов или закрыть клавиатуру и снова начать редактирование. В чем может быть проблема?
1 ответ
Сегментированный элемент управления не является хорошим выбором, если вы действительно хотите, чтобы поведение UIButton
для вашего предыдущего / следующего контроля.
Я думаю, что происходит то, что вы инициализируете панель инструментов с сегментированным элементом управления, а сегмент не выбран. Поэтому, когда вы нажимаете предыдущий / следующий раз в первый раз, значение изменяется, и этот сегмент выбирается для этого конкретного сегментированного элемента управления. Если вы продолжите нажимать предыдущий / следующий, в конечном итоге вы получите сегментированный элемент управления, в котором уже выбран сегмент, и этот сегмент не будет вызывать событие изменения значения при касании, поскольку это уже выбранный сегмент.
Вы можете явно отменить выбор выбранного сегмента в вашем switchTextField:
метод (убедитесь, что вы не запускаете switchTextField:
рекурсивно) или вы можете изменить свою реализацию, чтобы использовать UIButton
объекты для prev / next вместо сегментированного элемента управления.
Я рекомендую пойти с UIButton
,