2014-01-28 41 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