tags:

views:

720

answers:

5

This is a very simple iPhone / Cocoa question. I have a button that transitions between two views. I set most of this up using interface builder. When I click the button and the second view is displayed, how do I programmatically change the text of the button (to say 'back', for instance)?

A: 

You need to define and connect an "outlet". Take a look at the documentation, making note of the section on "Connections and Bindings".

Jim Puls
+7  A: 

In your class declaration, declare a button object, and make sure it is specified as an IBOutlet:

IBOutlet UIButton* myButton;

Once you save this change, if you go back to Interface Builder, you should see this outlet when you right click on your File's Owner (assuming you have specified the File's Owner properly). Associate this outlet with the onscreen UIButton by right-click dragging.

Now the on screen object is associated with your in-code name.

Whereever you want to change the text on the UIButton, just say:

[myButton setTitle:@"Back - or whatever else you want it to say" 
          forState: UIControlStateNormal ];
// you can set different title text for each state 
// of the button (selected, active, or normal)
mmc
Worth clarifying that that's not an object, but a variable. The variable holds a pointer to the object (once the nib has been loaded). I know you know this, but many people get this mixed up and think that the variable is the object.
Peter Hosey
A: 

You'll need to set up an outlet for IB:

@interface MyViewController : UIViewController {
    IBOutlet UIButton *myButton;
}

Save, bring up IB, set the file's owner to MyViewController, then create referencing outlets from both your UIView and UIButton to the appropriate points in the file's owner in the Connections Inspector.

Then in the implementation, you could do:

[myButton setTitle:@"Back" forState:UIControlStateNormal];

If you get lost with the connections, I'd recommend having a look at the lecture notes and video lectures at http://www.stanford.edu/class/cs193p/cgi-bin/index.php , which go into some detail about iPhone basics.

Hope that helps.

sinissaar
+3  A: 

Alternately, you can assign a unique tag to the control and use -[UIView viewWithTag:] to get a UIView pointer to the control. In most cases, outlets are the preferred mechanism, but tags are useful in things like table cells.

Frank Szczerba
+1  A: 

Most of the posts so far have focused on creating the button, and are very correct. The following answers the rest of the question:

When I click the button and the second view is displayed, how do I programmatically change the text of the button (to say 'back', for instance)?

The easiest way, if I understand your circumstance correctly, is to use the plug-n-play UINavigationBarController. First you want to push your second view controller onto the view stack:

// In firstViewController.m
self.navigationController = [[UIViewController alloc]initWithNibName:@"secondView" bundle:nil];
[self pushViewController:secondViewController animated:TRUE];

When your second view controller is shown, you should automatically get a back button on the left side of the nav-bar. If there is a need to change the text of that back button, you can simply refer to it like so:

// In secondViewController.m
-(void)ViewWillAppear
{
  [self.navigationItem.backBarButtonItem setText:@"GoBack"];
}

There are also the left and rightBarButtonItem(s) which are handy for more complex navigation. Here is a less plug-n-play scenario:

// In secondViewController.h
-(IBAction)goBack; (this should appear as an action in your associated nib file)

// In secondViewController.m
-(void)viewDidLoad
{
  self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"GoBack" style:UIBarButtonItemStylePlain target:self action:@selector(goBack)];
}

-(IBAction)goBack
{
  // logic to be done before going back
  [self popViewControllerAnimated:secondViewController animated:TRUE];
}
TahoeWolverine
So, this is objective-c. It looks dirty.
jjnguy