UISegmentedControl setSelectedSegmentIndex: без valueChanged Action

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

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

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

Ответ 1

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

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

EDIT: это исправлено в iOS 5.

Ответ 2

Как Apple

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

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

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

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

Ответ 3

У меня все еще есть эта проблема в iOS 7.1.

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