placing a UIToolbar over the Keyboard in Xcode 4.3

ios4, iphone, uitoolbar

Solution

@interface keyboardViewController : UIViewController<UITextFieldDelegate>


@property (retain, nonatomic) IBOutlet UITextField *textField1;
@property (retain, nonatomic) IBOutlet UITextField *textField2;

and in .m place instead of this code

        textField1.inputAccessoryView  = keyboardToolbar;
        textField2.inputAccessoryView  = keyboardToolbar;

paste these code

for (id view in self.view.subviews) {
    if ([view isKindOfClass:[UITextField class]]) {
        [(UITextField *)view setInputAccessoryView:keyboardToolbar];
    }
}

paste this code

-(void) resignKeyboard:(id)sender{

         [self.view endEditing:YES];
}

instead of this

-(void) resignKeyboard:(id)sender
    {
        if ([textField1 isFirstResponder])
            [textField1 resignFirstResponder];

        else if ([textField2 isFirstResponder])
        [textField2 resignFirstResponder];
    }

add this code in viewDidLoad method

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

and

-(void)nextField:(id)sender{

    if ([textField1 isFirstResponder]) {

        [textField2 becomeFirstResponder];
        [previousButton setEnabled:YES];
        [nextButton setEnabled:NO];
    }
}

-(void)previousField:(id)sender{

    if ([textField2 isFirstResponder]) {

        [textField1 becomeFirstResponder];
        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    }
}

-(void)keyboardWillShow:(id)sender{

    if ([textField2 isFirstResponder]) {

        [nextButton setEnabled:NO];
        [previousButton setEnabled:YES];
    }else if ([textField1 isFirstResponder]) {

        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    }
}

Problem

This is my first post and I am quite new to programming in the iOS. I am using xcode 4.3 and have what is probably an easy question. I have looked all over for a way to place a toolbar above the keyboard that has a prev/next button on it. I have found several tuts on how to do this when xcode was using the interface builder. But I can not find one that is for the newest version of xcode. So I have taken what I have found on the internet and from the Apple dev site and came up with some code. The only thing is, it doesn't work! I get an error that says assignment to readonly property on the lines with the inputAcessoryView. I know that it is probably something simple, but when transfering the code from the previous version to the newer version, I most likely messed something up. Could someone check out my code and let me know what I did wrong. Thanks so much. I have included my .h/.m files ``` #import <UIKit/UIKit.h> @interface keyboardViewController : UIViewController @property (retain, nonatomic) IBOutlet UIView *textField1; @property (retain, nonatomic) IBOutlet UIView *textField2; @property (nonatomic, retain) UIToolbar *keyboardToolbar; -(void)resignKeyboard:(id)sender; -(void)previousField:(id)sender; -(void)nextField:(id)sender; @end ``` implimentation ``` #import "keyboardViewController.h" @interface keyboardViewController () @end @implementation keyboardViewController @synthesize textField1; @synthesize textField2; @synthesize keyboardToolbar; - (void)viewDidLoad { [super viewDidLoad]; if (keyboardToolbar == nil) { keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; UIBarButtonItem *previousButton = [[UIBarButtonItem alloc] initWithTitle:@"previous" style:UIBarButtonItemStyleBordered target:self action:@selector(previousField:)]; UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStyleBordered target:self action:@selector(nextField:)]; UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemFlexibleSpace) target:nil action:nil]; UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemDone) target:self action:@selector(resignKeyboard:)]; [keyboardToolbar setItems:[[NSArray alloc] initWithObjects:previousButton, nextButton, extraSpace, done, nil]]; textField1.inputAccessoryView = keyboardToolbar; textField2.inputAccessoryView = keyboardToolbar; } } -(void) resignKeyboard:(id)sender { if ([textField1 isFirstResponder]) [textField1 resignFirstResponder]; else if ([textField2 isFirstResponder]) [textField2 resignFirstResponder]; } -(void) previousField:(id)sender { if ([textField1 isFirstResponder]) [textField2 becomeFirstResponder]; else if ([textField2 isFirstResponder]) [textField1 becomeFirstResponder]; } -(void) nextField:(id)sender { if ([textField1 isFirstResponder]) [textField2 becomeFirstResponder]; else if ([textField2 isFirstResponder]) [textField1 becomeFirstResponder]; } - (void)viewDidUnload { [self setTextField1:nil]; [self setTextField2:nil]; [self setKeyboardToolbar:nil]; [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } @end ```

Original source