UISegmentedControl fires ValueChanged when loading

2019-06-01 05:23发布

问题:

I have a UISplitViewController utility type app where each UIViewController handles various calculations. I have a popover with segmented controls that allows the user to set certain options. The problem I have is when saving and reloading the contents of UITextfields and the selected segment index, if the segment control index was saved and is == 1 a valuechanged event is fired off from viewdidload as the state is set from

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

Is there anyway to prevent valuechanged being fired as the selectedsegment is set in view did load? or maybe someway to determine the difference between touch events versus code

It seems strange this happens, maybe there is another way....

Thank You

回答1:

Considering the view is just loading, the segmented control doesn't have a previous value, so it will assume it is indeed being changed and acts accordingly. One way you could potentially get around this is to set up a BOOL value in your IBAction method linked to the segmented control. At the beginning of your viewDidLoad method, say wasLoaded = NO (where wasLoaded will need to be declared in your header file). Then you'll assign your selectedSegmentIndex. Afterwards, declare wasLoaded = YES. Finally, in your IBAction method, say something like

if (wasLoaded) { 
    // do what you need to do since this isn't when it's being initialized 
}


回答2:

The quickest way to get this done is to detach the IBAction in the interface builder and add a addTarget:action:forControlEvents: method after you change the value in viewDidLoad. There is no way of making a distinction between touch triggered change and a programmatic change for UIControlEventValueChanged. You can look at touch control events but it is not the same as the value changed one.



回答3:

Deepak is right. If you're not using Interface Builder to setup your UISegmentedControl, you should first set the selected index of the UISegmentedControl and then call addTarget:action:forControlEvents:. Like this:

            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];