Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

John Baughman

macrumors regular
Original poster
Oct 27, 2003
100
0
I have a segmented control with 2 buttons set as the right side button. When I tap either of these buttons the navigation bar slides to the new view and the back button displays correctly, but then immediately slides again as if I were pushing another view on to the stack. For example if I am going from the People view to the Prefernces view, The back button goes like this...

People -> Preferences.

The proper view displays but the didDisplay delegate method does not fire. If I then click the back button which says Preferences, it slides back to a People button and the didDisplay delegate fires. Clicking the People button properly takes me back where I started.

My code looks like this...

Code:
   //Code to create the buttons
segmentedControl = [ [ UISegmentedControl alloc ] initWithItems: nil ]; 

segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; 
[ segmentedControl insertSegmentWithTitle: @"Prefs" atIndex: 0 
				animated: NO ]; 
[ segmentedControl insertSegmentWithTitle: @"Add" atIndex: 1 
				animated: NO ]; 
		
[ segmentedControl addTarget:self 
                        action:@selector(segmentedControlPressed:) 
			forControlEvents:UIControlEventValueChanged ];
		
UIBarButtonItem *segmentItem = [[UIBarButtonItem alloc]
                         initWithCustomView:segmentedControl];
[segmentedControl release];
self.navigationItem.rightBarButtonItem = segmentItem;	
[segmentItem release];

[self.navigationItem setHidesBackButton:YES animated:YES];
self.navigationItem.leftBarButtonItem = self.editButtonItem;

Code:
   //code that pushes the view after clicking the prefs button in the segmented control

self.navigationController.navigationBarHidden = NO;
	
PrefsViewController *prefsViewController = [[[PrefsViewController alloc]
        initWithNibName:@"PrefsViewController"	bundle:nil] autorelease];

[self.navigationController pushViewController:prefsViewController
                                        animated:YES];
	
prefsViewController.view.backgroundColor = self.view.backgroundColor;

Not sure where to start in figuring out this one. Maybe someone can point me in the right direction.

Thanks.
John
 

John Baughman

macrumors regular
Original poster
Oct 27, 2003
100
0
Figured it out

I set the target for the sgmentedControl to segmentedControlPressed for value changed events. In segmentedControlPressed I checked to see if selectedSegmentIndex == 0, if 0 called the Prefs action method and else ran the Add action method. This would have worked fine except that I was immediately resetting the selectedSegmentIndex to UISegmentedControlNoSegment which caused segmentedControlPressed method to run again because the segmentedControl selected value changed to -1. Since I was only checking if the selectedSegmentIndex was 0, the Add method was then called, pushing the add view on top of the prefs view. I did not even notice that it was the wrong view showing up.

Fixed it be uniquely checking the value of selectedSegmentIndex. Bad code and good code follows....

Code:
    //BAD CODE!!

- (void)segmentedControlPressed:(id)sender
{
	UISegmentedControl *sg = sender;
 
	if (sg.selectedSegmentIndex == 0) { 
		[self prefs]; 

	} else { 		
		[self add];

	} 
	
	sg.selectedSegmentIndex = UISegmentedControlNoSegment;

}

Code:
    //GOOD CODE

- (void)segmentedControlPressed:(id)sender
{
	UISegmentedControl *sg = sender;

	if (sg.selectedSegmentIndex == 0) { 
		[self prefs]; 

	} else if(sg.selectedSegmentIndex == 1) { 
		[self add];
	} 
	
	sg.selectedSegmentIndex = UISegmentedControlNoSegment;
}
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.