Изменение UISegmentedControl выбранного индекса или значения программно - программирование

Изменение UISegmentedControl выбранного индекса или значения программно

У меня есть 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 с помощью переменной, получить соответствующую визуальную обратную связь и проверить выбранный индекс в метод, чтобы что-то произошло в зависимости от выбранного индекса. См. Мой ответ ниже для решения.

4b9b3361

Ответ 1

Изменить viewDidLoad:

[seg setSelectedSegmentIndex:index];

вы меняете значение индекса как свое желание.

Ответ 2

Из кода вы можете просто сделать seg.selectedSegmentIndex = someDefaultIndex.

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

Ответ 3

Это помогает сортировать выбранный сегмент с точки зрения визуального 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]];
    }
}

Ответ 4

Чтобы повторить то, что я пытался выполнить с этим вопросом: я хочу установить динамический индекс UISegmentedControl с помощью переменной динамически, получить соответствующую визуальную обратную связь и проверить выбранный индекс в методе, чтобы что-то произошло в зависимости от выбранный индекс.

Первоначально я догадался, что это так же просто, как: mySegmentedController.selectedSegmentIndex = someIndex, а затем проверить индекс. Но, как сказано в моем вопросе, это не работало для меня. Поведение нечетное. После запуска этого кода соответствующая кнопка не будет выделяться.

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

http://owolf.net/uploads/StackOverflow/SegmentedControllers.zip

Ответ 5

ПРЕДУПРЕЖДЕНИЕ: Это не совсем отвечает на вопрос, но тесно связано.

У меня была аналогичная проблема. В большинстве случаев мой UISegmentedController работал нормально. Он имеет 4 сегмента, Off, 30, 60 и 120.

В случайные интервалы (как правило, до релиза!!) сегмент Off становится недоступным из пользовательского интерфейса. (Я не пытался выбирать его из кода, потому что это не то, что мне нужно сделать, и не решит мою проблему.)

Решение состоит в том, чтобы удалить этот UISegmentedController из моего XIB и заменить его новым (и точно идентичным), который затем отлично работает.

Я даже CMD-C и CMD-V нарушил UISegmentedController в другое приложение XIB. А сегмент Off (т.е. Тот, который имеет индекс 0), не был выбран в этом XIB тоже.

Это похоже на проблему с XCode.

Ответ 6

Swift 3.0

segmentedControl.selectedSegmentIndex = #your value#