2013-02-27 2 views
0

У моего приложения iOS есть форма с примерно дюжиной полей, и я хотел добавить кнопки «Предыдущий»/«Далее» над клавиатурой, чтобы помочь пользователям перемещаться между полями. У меня есть что-то вроде этого:Кнопки UISegmentedControl перестают работать

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 соответствовало вашим предыдущим/последующим элементам управления.

Я думаю, что происходит инициализация панели инструментов с помощью сегментарного элемента управления и выбора сегмента. Поэтому, когда вы выбираете prev/next в первый раз, значение изменяется и этот сегмент выбирается для этого определенного сегментированного элемента управления. По мере того, как вы продолжаете использовать prev/next, в конечном итоге вы попадаете в сегментированный элемент управления, у которого уже выбран сегмент, и этот сегмент не будет запускать событие с измененным значением при нажатии, потому что это уже выбранный сегмент.

Вы можете явно отменить выбранный сегмент в методе switchTextField: (убедитесь, что вы не вызываете switchTextField: рекурсивны), или вы можете изменить реализацию использовать UIButton объекты для преда/следующего вместо сегментного контроля.

Я рекомендую пойти с UIButton.

+0

Спасибо за подсказку, чтобы сбросить выбранный сегмент, это именно то, что было. Причина перехода с сегментированным управлением вместо кнопок просто косметическая: я предпочитаю, когда эти кнопки «предыдущий/следующий» соединены как сегменты в одном элементе управления, а не отдельные кнопки с пространством между ними. – SaltyNuts

+0

, хотя это немного больше работы, вы можете настроить 'UIButton' с вашими фоновыми изображениями, чтобы они выглядели как подключенные кнопки. Обычно я стараюсь избегать реализаций, которые используют элементы управления в том виде, в каком они не предназначены (например, с помощью элемента управления выбором в виде кнопки), но если он выглядит/работает так, как вам нравится, тогда это здорово. – XJones

Смежные вопросы