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 делегат текущего класса. Это не вызовет делегат "изменение значения".