2010-12-31 1 views
10

Я устанавливаю selectedSegmentIndex кода UISegmentedControl через код.
Всякий раз, когда я это делаю, вызывается функция valueChanged. Это звучит логично для меня, но есть ли способ установить выбранный сегмент без вызова действия? Он должен просто обновить дисплей.UISegmentedControl setSelectedSegmentIndex: без valueChanged Действие

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

Я могу отключить действие, изменить выбранное значение и снова подключить действие. Но, может быть, есть лучший способ.

+2

Как насчет того, чтобы установить флаг перед тем, как установить его в коде и проверить флаг в методе действий? Если вы не используете свойство тега элемента управления, вы можете использовать его как флаг вместо добавления нового bool. – Anna

+0

Ребята, я застрял с этим сценарием в течение 8 часов. И, наконец, в конечном итоге вы удовлетворены ответом мата. Серьезно, почему сегментный контроль? Если вы слишком зациклились на этом вопросе, попробуйте концепцию флага, указанную Анной ..Большое спасибо anna и matt ... – iPrabu

ответ

10

Ваш вопрос разумный; Я могу только предположить, что вы нашли ошибку, так как это так необычно. Обычно изменение элемента управления в коде не вызывает каких-либо событий управления. Установка UIDatePicker не выдает событие Value Changed. Установка currentPage UIPageControl не выдает событие Value Changed. Установка value UISlider не генерирует событие Value Changed. Установка UISwitch не испускает событие Value Changed. Аналогично, установка text UITextField не приводит к событию Editing Changed. Таким образом, тот факт, что изменение UISegmentedControl's selectedSegmentIndex испускает событие Value Changed, кажется неправильным. Я собираюсь подать ошибку, и я думаю, вы тоже.

Я не вижу очевидного способа определить, было ли инициировано событие Value Changed при нажатии пользователем или программным способом. Вам придется поднять и опустить флаг BOOL или что-то в этом роде.

EDIT: Это исправлено в прошивке 5.

+1

Кстати, яблоко подтвердило это как известную проблему. Идентификатор ошибки # 8372405 –

+0

Спасибо, что представили это как ошибку для Apple! Я тоже. – matt

+2

Это исправлено в iOS 5. –

0

В соответствии с Apple,

Свойство selectedSegmentIndex, как правило, используется для определения номера индекса для идентификации выбранного сегмента (то есть, последний сегмент прикоснулся).

Значение по умолчанию - UISegmentedControlNoSegment (без выбора сегмента), пока пользователь не коснется сегмента. Установите для этого свойства значение -1, чтобы отключить текущий выбор.

Вы также можете изменить его на другое значение в зависимости от вашего требования.

UISegmentedControl игнорирует это свойство, когда элемент управления находится в кратковременном режиме. Когда пользователь касается сегмента для изменения выбора, генерируется событие управления UIControlEventValueChanged; если сегментированный элемент управления настроен для ответа на это событие управления, он отправляет сообщение о действии своей цели.

0

Я до сих пор этот вопрос прошивки 7.1.

Я перегружал таблицу и задавал индекс сегмента, но он вызывал делегат «измененный значение». Чтобы избежать этого, я сначала делютирую «делегат сегмента», а затем программно задаю значение и снова сбрасываю делегат в текущий класс. Это не вызовет делегат «изменение значения».

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