Кнопки 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,

Другие вопросы по тегам