 <p>Comparing user-visible strings is generally considered bad practice (and becomes tedious when you need to do i18n), especially with string literals since it's vulnerable to typos.</p> <p>If you're just going to <em>toggle</em> between two states, the easiest thing to do is to use the <code>UIControl.selected</code> property (corresponding to <code>UIControlStateSelected</code>):</p> <pre><code>// In init [myButton setTitle:@"test" forState:UIControlStateNormal]; [myButton setTitle:@"test2" forState:UIControlStateSelected]; [myButton setTitle:@"test2" forState:UIControlStateSelected|UIControlStateHighlighted]; // Toggle myButton.selected = !myButton.selected; </code></pre> <p>It also makes the code a lot cleaner when you when you decide to toggle the button image/background/text colours too.</p> <p>Note the slight gotcha: If you don't set the title for <code>UIControlStateSelected|UIControlStateHighlighted</code> it will use the title for <code>UIControlStateNormal</code> when the button is both selected and highlighted (touched).</p>