UISegmentedControl вызывает метод действия для программного изменения selectedSegmentIndex - PullRequest
3 голосов
/ 21 сентября 2011

У меня есть UISegmentedControl в моем XIB-файле. Он связан с методом действия при изменении значения в файле xib.

Когда я программно устанавливаю значение selectedSegmentIndex, метод действия вызывается

mysegmentedcontrol.selectedSegmentIndex = index

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

Это происходит только для UISegmentedControl.

Ответы [ 4 ]

6 голосов
/ 21 сентября 2011

.h файл

BOOL isProgramaticallyChanged;

.m файл

- (IBAction)segmentAction:(id)sender { // valuechanged connected function

        UISegmentedControl *segControll = (UISegmentedControl *)sender;

    if (segControll.tag == 55) { // while create segment specify tag value to 55 (to set use via IB or Code)

        if (isProgramaticallyChanged == NO) {

            // your valuechanged code here

        }

        else {

            isProgramaticallyChanged = NO; //important

        }

    }

    else if (segControll.tag == 66) { // for many segments

    }

        //...like this do for all segments
}

в .m файле

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

if (mysegmentedcontrol.selectedSegmentIndex != index) {

    isProgramaticallyChanged = YES;

    mysegmentedcontrol.selectedSegmentIndex = index;

}
3 голосов
/ 21 сентября 2011

Решение, вероятно, состоит в том, чтобы связать метод IBAction с событием touchUpInside и распространить изменение значения там, если вы планируете также изменить выбранный индекс программным путем.

Из того, что мы можем прочитать даже в Руководство по основам какао , события, поступающие из элементов управления пользовательского интерфейса, должны отправляться только в том случае, если событие инициируется в ответ на действия пользователя над элементом управления, а не из-за программного изменения , Это либо мое недоразумение, либо какая-то ошибка UISegmentedControl.

Мое решение более подробно

Подключите метод IBAction к событию UISegmentedControl Touch Up Inside и перенаправьте параметр sender в метод действия, обрабатывающий Value Changed. Таким образом, если происходит программное изменение значения, элемент управления не будет вызывать обработчик изменения значения. Только при непосредственном воздействии пользователя на элемент управления.

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

2 голосов
/ 22 февраля 2012

Я добавлю кое-что еще к ответам, которые могут казаться немного более контролируемыми. Просто вызовите removeTarget, сделайте свое программное обновление для выбранного сегмента, повторно добавьте цель (для UIControlEventValueChanged)

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

0 голосов
/ 08 апреля 2019

Больше не происходит.

Действие UIControlEventValueChanged вызывается при изменении сегмента через пользовательское событие.

...