加载selectedindex时,UISegmentedControl会触发ValueChanged

时间:2011-06-14 11:46:59

标签: iphone objective-c ipad uisegmentedcontrol

我有一个UISplitViewController实用程序类型应用,其中每个UIViewController处理各种计算。我有一个带有分段控件的弹出窗口,允许用户设置某些选项。我遇到的问题是保存和重新加载UITextfields的内容和选定的段索引,如果段控制索引已保存并且== 1,则从viewdidload作为状态触发valuechanged事件是从

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

无论如何都要阻止valuechanged被触发,因为在视图中设置了selectedsegment吗?或者可能在某种程度上确定触摸事件与代码之间的区别

这种情况似乎很奇怪,也许有另一种方式......

谢谢

3 个答案:

答案 0 :(得分:2)

考虑到视图只是加载,分段控件没有先前的值,因此它将假设它确实被更改并相应地起作用。您可以解决此问题的一种方法是在链接到分段控件的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 :(得分:1)

完成此操作的最快方法是在更改IBAction中的值后,在界面构建器中分离addTarget:action:forControlEvents:并添加viewDidLoad方法。没有办法区分触摸触发的更改和UIControlEventValueChanged的程序化更改。您可以查看触摸控制事件,但它与更改的值不同。

答案 2 :(得分:0)

迪帕克是对的。如果您未使用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];