2014-01-28 77 views
0

當用戶點擊UISegmentedControl並更改選定哪個段時,我想執行一些驗證。如果驗證失敗,我想'撤消'他們的選擇,並重新選擇他們以前選擇的項目。使用UISegmentedControl撤消選擇

這樣做最簡單的方法是什麼?我想,我需要這樣的東西

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

,但我一直在尋找在Apple Docs,但我沒有看到這樣的事情 - 我真的沒有看到在它will在所有東西。我需要創建一個類別或子類來做到這一點,或者我只是想念它嗎?

我想我可以添加一個ivar,在它被驗證之後保存所選的段索引,然後在驗證失敗時調用[mySegmentedControl setSelectedSegmentIndex:myIvar];,或者當它通過時調用myIvar = [mySegmentedControl selectedSegmentIndex];,但感覺有點混亂。如果我在同一個屏幕上有很多分段控件,這也有點痛苦。我相信如果我確實創建了自己的子類,那麼我將不得不這樣做。

編輯: 我用過的其他編程語言原生支持'撤銷'功能,而程序員不必自行實現撤銷。我期待着看看有沒有人知道Objective-C這樣的東西。如果它不存在,是否有人知道除了我上面描述的伊娃法之外還有更好的實現方法?

回答

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