Ajout de UIToolbar pour la saisie d'une vue accessoire dans certains champs de text

Dans ma quête pour ma première application iPhone, j'ai posté sur la façon correcte de gérer la touche de return sur le keyboard iOS. Maintenant, j'ai besoin de comprendre la barre d'outils au-dessus du keyboard avec les buttons prev / next et done. J'ai travaillé avec un exemple du site suivant: Input Accessory View

L'exemple fonctionne, mais je veux utiliser un UIToolbar et un UIBarButtonItem au lieu d'une simple vue avec des buttons. J'ai essayé différentes combinaisons, aucune fonctionne encore. Voici ce que j'ai jusqu'ici.

Entête:

#import <UIKit/UIKit.h> @interface ViewController : UIViewController <UITextFieldDelegate> { UITextField* txtActiveField; UIToolbar* keyboardToolbar; UIBarButtonItem* btnDone; UIBarButtonItem* btnNext; UIBarButtonItem* btnPrev; } @property (nonatomic, strong) IBOutlet UITextField* firstNameTextField; @property (nonatomic, strong) IBOutlet UITextField* lastNameTextField; @property (nonatomic, strong) IBOutlet UITextField* cityTextField; @property (nonatomic, strong) UITextField* txtActiveField; @property (nonatomic, strong) UIToolbar* keyboardToolbar; @property (nonatomic, strong) UIBarButtonItem* btnDone; @property (nonatomic, strong) UIBarButtonItem* btnNext; @property (nonatomic, strong) UIBarButtonItem* btnPrev; -(void)createInputAccessoryView; @end 

La source:

 #import "ViewController.h" @implementation ViewController @synthesize firstNameTextField = _firstNameTextField; @synthesize lastNameTextField = _lastNameTextField; @synthesize cityTextField = _cityTextField; @synthesize txtActiveField = _txtActiveField; @synthesize keyboardToolbar = _keyboardToolbar; @synthesize btnDone = _btnDone; @synthesize btnNext = _btnNext; @synthesize btnPrev = _btnPrev; - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; [self createInputAccessoryView]; } - (void)viewDidUnload { [self setFirstNameTextField:nil]; [self setLastNameTextField:nil]; [self setCityTextField:nil]; [self setTxtActiveField:nil]; [self setKeyboardToolbar:nil]; [self setBtnDone:nil]; [self setBtnNext:nil]; [self setBtnPrev:nil]; [super viewDidUnload]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } -(void)gotoPrevTextfield { if (self.txtActiveField == self.firstNameTextField) { return; } else if (self.txtActiveField == self.lastNameTextField) { [self.firstNameTextField becomeFirstResponder]; } else if (self.txtActiveField == self.cityTextField) { [self.lastNameTextField becomeFirstResponder]; } } -(void)gotoNextTextfield { if (self.txtActiveField == self.firstNameTextField) { [self.lastNameTextField becomeFirstResponder]; } else if (self.txtActiveField == self.lastNameTextField) { [self.cityTextField becomeFirstResponder]; } else if (self.txtActiveField == self.cityTextField) { return; } } -(void)doneTyping { [self.txtActiveField resignFirstResponder]; } -(void)createInputAccessoryView { self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent; self.keyboardToolbar.tintColor = [UIColor darkGrayColor]; btnPrev = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:@selector(gotoPrevTextfield:)]; btnNext = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:@selector(gotoNextTextfield:)]; btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTyping:)]; [self.keyboardToolbar addSubview:(UIView*)btnPrev]; [self.keyboardToolbar addSubview:(UIView*)btnNext]; [self.keyboardToolbar addSubview:(UIView*)btnDone]; [self.firstNameTextField setInputAccessoryView:self.keyboardToolbar]; [self.lastNameTextField setInputAccessoryView:self.keyboardToolbar]; [self.cityTextField setInputAccessoryView:self.keyboardToolbar]; } -(void)textFieldDidBeginEditing:(UITextField*)textField { self.txtActiveField = textField; } @end 

Quand je démarre l'application, j'obtiens:

 012-01-21 09:31:19.798 KeyboardToolbar[14772:f803] -[UIBarButtonItem superview]: unrecognized selector sent to instance 0x6b19350 2012-01-21 09:31:19.799 KeyboardToolbar[14772:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIBarButtonItem superview]: unrecognized selector sent to instance 0x6b19350' *** First throw call stack: (0x13bc052 0x154dd0a 0x13bdced 0x1322f00 0x1322ce2 0x5042f 0x4a72b 0x3422 0x2a58 0xd964e 0x39a73 0x39ce2 0x39ea8 0x40d9a 0x11be6 0x128a6 0x21743 0x221f8 0x15aa9 0x12a6fa9 0x13901c5 0x12f5022 0x12f390a 0x12f2db4 0x12f2ccb 0x122a7 0x13a9b 0x2728 0x2685 0x1) terminate called throwing an exception 

Mon hypothèse est que je n'ai pas atsortingbué correctement l'un des éléments. Je me request aussi si j'ai besoin d'avoir des champs dans la class pour les buttons ou si ceux-ci peuvent juste être ajoutés à la barre d'outils. Et j'ai mis une ligne dans l'entête pour ne pas avoir à mettre toutes mes methods au début du file. Je ne connais pas encore la syntaxe à transmettre une méthode comme vous pourriez le faire en C.

Merci.

Mettre à jour:

J'ai donc apporté quelques modifications à createInputAccessoryView. J'utilise maintenant addItems pour append les buttons. J'ai rendu les variables de button locales (mais j'ai eu le même problème quand elles étaient comme avant). Les bonnes nouvelles sont que l'application ne plante plus, les mauvaises nouvelles sont que la barre d'outils montre, mais sans aucun button. Je ne sais pas exactement ce que je dois faire pour que les buttons s'affichent. Tous les exemples que j'ai vus sont similaires.

 -(void)createInputAccessoryView { self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent; self.keyboardToolbar.tintColor = [UIColor darkGrayColor]; UIBarButtonItem* previousButton = [[UIBarButtonItem alloc] initWithTitle:@"Previous" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoPrevTextfield)]; UIBarButtonItem* nextButton = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoNextTextfield)]; UIBarButtonItem* flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTyping:)]; [keyboardToolbar setItems:[NSArray arrayWithObjects: previousButton, nextButton, flexSpace, doneButton, nil] animated:NO]; [self.firstNameTextField setInputAccessoryView:self.keyboardToolbar]; [self.lastNameTextField setInputAccessoryView:self.keyboardToolbar]; [self.cityTextField setInputAccessoryView:self.keyboardToolbar]; } 

UIBarButtonItem n'est pas une sous-class UIView , vous ne pouvez donc pas l'append en tant que sous-vue de l' UIToolbar . Au lieu de cela, utilisez la – setItems:animated: dans votre barre d'outils pour append ces buttons.

Je ne sais pas si c'est trop tard. J'ai mis ma solution sur l'ajout d'un UIToolbar dans UIKeyboard, et les types de keyboard change avec le contenu UITextField, et la manipulation de UIBarButtonItem avec "Précédent", "Suivant" et "Terminé" sur Github . Et si le TextFields à différentes sections de la tableview, il se révèle être plus difficile.

J'ai réussi à utiliser votre code dans mon projet actuel avec l'ajout de la barre d'outils au-dessus d'un UIDatePicker qui est initié par un champ de text dans un UITableView. J'utilise des cellules statiques.

Ça marche pour moi.

J'ai les UITextFields comme IBOutlets et seulement utiliser ce code pour définir l'InputAccessoryView

 [textFieldName setInputAccessoryView:self.keyboardToolbar]; [textFieldEmail setInputAccessoryView:self.keyboardToolbar]; [textFieldPhone setInputAccessoryView:self.keyboardToolbar]; [textFieldDate setInputAccessoryView:self.keyboardToolbar]; [textFieldSize setInputAccessoryView:self.keyboardToolbar]; 

Eh bien, les buttons suivant et précédent fonctionnent comme un charme (mais seulement sur le path de la table). Je devais encore manuellement faire défiler la table vers le haut en remontant. Pour une raison quelconque, UITableViewController ne gère que le scénario de défilement, que j'ai trouvé assez étrange, mais voici mon extrait de code pour le précédent.

 - (void) gotoPrev { if (self.activeField == textFieldName) { // name --> nowhere return; } else if (self.activeField == textFieldEmail) { // email --> name [textFieldName becomeFirstResponder]; } else if (self.activeField == textFieldPhone) { // phone --> email [textFieldEmail becomeFirstResponder]; // Scroll jeegar NSIndexPath * myIndexPath= [NSIndexPath indexPathForRow:0 inSection:0]; [self.tableView scrollToRowAtIndexPath:myIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; } else if (self.activeField == textFieldDate) { // date --> phone [textFieldPhone becomeFirstResponder]; } else if (self.activeField == textFieldSize) { // people --> date [textFieldDate becomeFirstResponder]; } } 

Je pense que vos buttons ne sont tout simplement pas visibles à cause du code suivant:

 self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent; self.keyboardToolbar.tintColor = [UIColor darkGrayColor]; 

Essayez d'utiliser

 self.keyboardToolbar.barStyle = UIBarStyleBlack; self.keyboardToolbar.tintColor = [UIColor whiteColor]; 

au lieu

Le problème doit être à l'endroit d'où vous ajoutez cette vue de sous-accessoire.