Ответ 1
Изменить viewDidLoad:
[seg setSelectedSegmentIndex:index];
вы меняете значение индекса как свое желание.
У меня есть UISegmentedControl с двумя сегментами (индекс: 0 и 1), который я пытаюсь выполнить с помощью reset до 0. Когда я запускаю приведенную ниже команду, индекс reset не имеет индекса 0, как ожидалось. Вместо этого он выделяет сегмент с индексом 1.
[seg setSelectedSegmentIndex:0];
Как ни странно, когда я регистрирую выбранный сегмент, он возвращает 0
.
NSLog(@"seg setSelectedSegmentIndex %d", seg.selectedSegmentIndex);
Также странно, что после запуска setSelectedSegmentIndex:0
я не могу повторно выбрать сегмент 0 вручную, он, кажется, заблокирован для сегмента 1, пока я не коснусь 1, когда он работает нормально.
Вот настройка кнопки:
itemArray = [NSMutableArray arrayWithObjects: @"Zero", @"One", nil];
seg = [[UISegmentedControl alloc] initWithItems:itemArray];
[seg setFrame:segRect];
seg.segmentedControlStyle = UISegmentedControlStyleBar;
seg.momentary = NO;
[seg addTarget:self action:@selector(someAction:) forControlEvents: UIControlEventValueChanged];
[mainView addSubview:seg];
ПРИМЕЧАНИЕ.. Чтобы повторить то, что я пытался выполнить с этим вопросом: я хочу динамически установить выделенный индекс UISegmentedControl с помощью переменной, получить соответствующую визуальную обратную связь и проверить выбранный индекс в метод, чтобы что-то произошло в зависимости от выбранного индекса. См. Мой ответ ниже для решения.
Изменить viewDidLoad:
[seg setSelectedSegmentIndex:index];
вы меняете значение индекса как свое желание.
Из кода вы можете просто сделать seg.selectedSegmentIndex = someDefaultIndex
.
Следует ли вам установить его в viewDidLoad:
или не полностью зависит от структуры вашего приложения. Например, если ваше приложение запускает и загружает представление в первый раз, и ему необходимо установить элемент управления на любое значение, которое оно имело во время предыдущего запуска приложения, тогда определенно имеет смысл сделать это там.
Это помогает сортировать выбранный сегмент с точки зрения визуального feedbak, то есть после программной настройки выбранного сегмента это будет правильно отображать сегменты.
for (int i=0; i<[seg.subviews count]; i++)
{
if ([[seg.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[seg.subviews objectAtIndex:i]isSelected])
{
[[seg.subviews objectAtIndex:i] setTintColor:[UIColor grayColor]];
}
if ([[seg.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[seg.subviews objectAtIndex:i] isSelected])
{
[[seg.subviews objectAtIndex:i] setTintColor:[UIColor blackColor]];
}
}
Чтобы повторить то, что я пытался выполнить с этим вопросом: я хочу установить динамический индекс UISegmentedControl с помощью переменной динамически, получить соответствующую визуальную обратную связь и проверить выбранный индекс в методе, чтобы что-то произошло в зависимости от выбранный индекс.
Первоначально я догадался, что это так же просто, как: mySegmentedController.selectedSegmentIndex = someIndex, а затем проверить индекс. Но, как сказано в моем вопросе, это не работало для меня. Поведение нечетное. После запуска этого кода соответствующая кнопка не будет выделяться.
Вот проект, где я его исправил, поэтому он работает. Не уверен, почему он работает. Возможно, задержка, которую я поставил там, перед установкой индекса. Я буду обновлять и комментировать файл проекта, если я могу его усовершенствовать.
http://owolf.net/uploads/StackOverflow/SegmentedControllers.zip
ПРЕДУПРЕЖДЕНИЕ: Это не совсем отвечает на вопрос, но тесно связано.
У меня была аналогичная проблема. В большинстве случаев мой UISegmentedController работал нормально. Он имеет 4 сегмента, Off, 30, 60 и 120.
В случайные интервалы (как правило, до релиза!!) сегмент Off становится недоступным из пользовательского интерфейса. (Я не пытался выбирать его из кода, потому что это не то, что мне нужно сделать, и не решит мою проблему.)
Решение состоит в том, чтобы удалить этот UISegmentedController из моего XIB и заменить его новым (и точно идентичным), который затем отлично работает.
Я даже CMD-C и CMD-V нарушил UISegmentedController в другое приложение XIB. А сегмент Off (т.е. Тот, который имеет индекс 0), не был выбран в этом XIB тоже.
Это похоже на проблему с XCode.
Swift 3.0
segmentedControl.selectedSegmentIndex = #your value#