Это изменение в iOS 5 для того, чтобы UISegmentedControl
соответствовал всем другим элементам управления.
Идея состоит в том, что действие должно запускаться автоматически только в результате взаимодействия с пользователем. До iOS 5 действия UISegmentedControl
выполнялись из-за взаимодействия с пользователем и программного взаимодействия. Однако инициирование изменения программно означает, что вы также можете сделать [myControl sendActionsForControlEvents:UIControlEventValueChanged]
самостоятельно.
Однако вы должны быть осторожны с этим. Скажем, вы делаете:
[segmentedControl setSelectedSegmentIndex:newIndex];
[segmentedControl sendActionsForControlEvents:UIControlEventValueChanged];
Если вы соберете и запустите это на iOS 5, все будет работать так, как вы ожидаете. Если вы создадите и запустите это на iOS 4, ваши действия будут запущены дважды (один раз, когда вы setSelectedSegmentIndex
, и снова, когда вы sendActions...
).
Способ обойти это - сделать какую-то охрану. Это может быть проверка во время выполнения, чтобы показать, что вы работаете на устройстве с iOS 5+, или даже что-то более приземленное, например:
// changingIndex is a BOOL ivar
changingIndex = YES;
[segmentedControl setSelectedSegmentIndex:newIndex];
changingIndex = NO;
[segmentedControl sendActionsForControlEvents:UIControlEventValueChanged];
и затем в вашем методе действия ...
- (void)segmentedControlSelectedIndexChanged:(id)sender {
if (!changingIndex) {
// your action code here, guaranteed to only run as a result of the sendActions... msg
}
}