2009-03-11 6 views
4

Быстрый вопрос о классе UISegmentedControl на iPhone.UISegmentedControl Behavior

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

Я видел UISegmentedControls в приложениях, которые отрицают это поведение и не переключаются, когда пользователь нажимает выбранный сегмент. А именно, приложение iTunes Store от Apple.

Есть ли простой способ предотвратить такое поведение, которое я пропускаю, или мне нужно написать некоторую логику в valueChanged?

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

Любые идеи?

ответ

8

Посмотрите в файле заголовка UISegmentedControl.h (простым способом является двойной щелчок на «UISegmentedControl» в XCode с нажатой командой).

Здесь вы увидите ряд элементов в _segmentedControlFlags struct. Если вы создаете категорию в UISegmentedControl, вы можете манипулировать любым из этих элементов, включая dontAlwaysToggleForTwoSegments, который, как вы могли догадаться по названию, является тем, что вы ищете.

Поскольку это задокументировано в заголовке API (хотя и не в реальной документации), оно должно быть довольно безопасным в использовании.

+0

Спасибо! Это именно то, что я искал. Вы знаете, почему Apple не делает это документированным свойством? – Jasarien

+0

Не совсем уверен, интересно, что это в заголовке, а не в документах, поскольку Apple оставила другие вещи из заголовка в других классах, когда они не хотели, чтобы он использовался ... –

+3

Это не документированный API. частный. Причина, по которой он раскрывается в заголовке, заключается в том, что симулятор использует устаревшую среду исполнения и требует, чтобы макеты ivar были согласованными. Поэтому приложения, скомпилированные против одной сборки симулятора, не всегда корректно работают с другими симуляторами. Если вы это сделаете, вы можете внезапно сломаться, если Apple изменит макет класса в будущих выпусках ОС. –

4

Это поведение по умолчанию было изменено в API 3.0.

4

В 3.0, «_segmentedControlFlags» было изменено на «моментальной» имущество, которое до сих пор можно найти в файле заголовка на UISegmentedControl.h.

1

Доступ к _segmentedControlFlags через категорию рассматривается как использование частного API и, следовательно, нарушение Лицензионного соглашения Apple, как я должен был узнать сегодня. До сих пор, я думал, Категории являются языковой функцией, чтобы исправить кого-то elses ужасный класс дизайна ...

+0

Если он выставлен в заголовке, он не является приватным. Использование частных API включает в себя привязку к частным фреймворкам и демпинг символьной информации для создания собственных заголовков для этих фреймворков. – Jasarien

+1

Получил почту от Apple вчера, жалуясь и требуя пропустить доступ к _segmentedControlFlags. – aldi