2014-01-28 8 views
0

Когда пользователь нажимает на UISegmentedControl и меняет, какой сегмент выбран, я хочу выполнить некоторую проверку. Если проверка не удалась, я хочу «отменить» их выбор и повторно выбрать элемент, который они ранее выбрали.Отменить выбор с UISegmentedControl

Что это самый простой способ сделать это? Я думаю, что нужно что-то вроде

- (BOOL) segment:(UISegmentedControl *)seg shouldSelectSegmentAtIndex:(NSInteger)newIndex` 

, но я смотрел на Apple Docs, но я не видел ничего подобного, - на самом деле я ничего не видел с will в нем вообще. Должен ли я создать категорию или подкласс для этого, или я просто пропущу его?

Предположим, я мог бы добавить ivar, который удерживает выбранный индекс сегмента после его проверки, а затем вызывает [mySegmentedControl setSelectedSegmentIndex:myIvar];, если проверка не удалась, или myIvar = [mySegmentedControl selectedSegmentIndex];, когда она проходит, но это немного портит. Это также немного больно, если у меня много сегментированных элементов управления на одном экране. Я полагаю, что если я создам свой собственный подкласс, мне придется сделать что-то подобное.

EDIT: Другие языки программирования, которые я использовал, изначально поддерживают функцию отмены, не требуя от программиста выполнить отмену самостоятельно. Я ищу, чтобы узнать, знает ли кто-нибудь об этом для Objective-C. Если он не существует, знает ли кто-нибудь лучший способ реализовать его иначе, чем метод ivar, описанный выше?

ответ

1

Я не верю, что на самом деле изящный способ сделать это без подклассов , Но поскольку на UISegmentedControl нет заметок для подкласса, это может быть вариант. Переопределите setSelectedSegmentIndex, где вы проверяете, должен ли быть выбран этот индекс. Если это так, вызовите super. Если нет, просто ничего не делайте.

Это предполагает, что нет внутренних методов, которые разрушают вещи (и которые вы не можете переопределить).

0

Я не совсем уверен, что вы просите, но если я правильно понимаю, я считаю, что это будет делать трюк:

[mySegmentedControl addTarget:self action:@selector(segmentChanged:) forControlEvents:UIControlEventChanged]; 

- (void)segmentChanged:(id)sender 
{ 
    if (myIvar != validated){ 
      [mySegmentedControl setSelectedSegmentIndex:defaultSegment]; 
    } 
} 
+0

Да, это довольно близко к тому, что я ищу, я просто ищу способ сделать это, возможно, немного более изящным. Я отредактировал свой OP, чтобы сделать его более ясным, что я ищу. – GeneralMike

+1

Вы заглянули в NSUndoManager? –

+0

У меня нет, я прочитаю на нем несколько [здесь] (https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Classes/NSUndoManager_Class/Reference/Reference.html). С первого взгляда это может быть то, что я ищу. – GeneralMike

Смежные вопросы