UISegmentedControl запускает ValueChanged при загрузке selectedindex - PullRequest
1 голос
/ 14 июня 2011

У меня есть приложение типа UISplitViewController, где каждый UIViewController выполняет различные вычисления.У меня есть поповер с сегментированными элементами управления, который позволяет пользователю устанавливать определенные параметры.У меня проблема при сохранении и перезагрузке содержимого UITextfields и выбранного индекса сегмента, если индекс управления сегментом был сохранен и имеет значение == 1, событие с измененным значением запускается с viewdidload, так как состояние устанавливается с

   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
   theDepthSegment.selectedSegmentIndex = [[defaults objectForKey:@"updateMe"] intValue];

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

Кажется странным, что это происходит, может быть, есть другой способ ....

Спасибо

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

Учитывая, что представление только загружается, сегментированный элемент управления не имеет предыдущего значения, поэтому он будет предполагать, что он действительно изменяется и действует соответствующим образом.Один из возможных способов обойти это - установить значение BOOL в вашем методе IBAction, связанном с сегментированным элементом управления.В начале вашего viewDidLoad метода, скажем, wasLoaded = NO (где wasLoaded нужно будет объявить в вашем заголовочном файле).Тогда вы назначите свой selectedSegmentIndex.После этого объявите wasLoaded = YES.Наконец, в вашем методе IBAction произнесите что-то вроде

if (wasLoaded) { 
    // do what you need to do since this isn't when it's being initialized 
}
1 голос
/ 14 июня 2011

Самый быстрый способ сделать это - отключить IBAction в конструкторе интерфейса и добавить метод addTarget:action:forControlEvents: после изменения значения в viewDidLoad.Невозможно провести различие между изменением, вызванным прикосновением, и программным изменением для UIControlEventValueChanged.Вы можете просматривать события сенсорного управления, но они не совпадают с измененными значениями.

0 голосов
/ 03 января 2012

Дипак прав. Если вы не используете Interface Builder для настройки UISegmentedControl, сначала необходимо установить выбранный индекс для UISegmentedControl, а затем вызвать addTarget:action:forControlEvents:. Как это:

            NSArray *items = [[NSArray alloc] initWithObjects:@"A", @"B", nil];
            UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:items];
            [items release];
            [segmentedControl setFrame:CGRectMake(10, 10, 300, 46.0f)];
            [segmentedControl setTag:60];
            [segmentedControl setSelectedSegmentIndex:savedSelectedIndex];
            [segmentedControl addTarget:self action:@selector(segControlClicked:) forControlEvents:UIControlEventValueChanged];
            [self.view addSubview:segmentedControl];
            [segmentedControl release]; 
...