Navigation button not working like I expected

Discussion in 'iOS Programming' started by John Baughman, Oct 19, 2009.

  1. macrumors member

    Joined:
    Oct 27, 2003
    #1
    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
     
  2. thread starter macrumors member

    Joined:
    Oct 27, 2003
    #2
    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;
    }
    
    
     

Share This Page