我有一个UISplitViewController
实用程序类型应用,其中每个UIViewController
处理各种计算。我有一个带有分段控件的弹出窗口,允许用户设置某些选项。我遇到的问题是保存和重新加载UITextfields
的内容和选定的段索引,如果段控制索引已保存并且== 1,则从viewdidload
作为状态触发valuechanged事件是从
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
theDepthSegment.selectedSegmentIndex = [[defaults objectForKey:@"updateMe"] intValue];
无论如何都要阻止valuechanged被触发,因为在视图中设置了selectedsegment吗?或者可能在某种程度上确定触摸事件与代码之间的区别
这种情况似乎很奇怪,也许有另一种方式......
谢谢
答案 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];