将UIToolbar添加到某些文本字段的输入附件视图中



在寻找我的第一个iPhone应用程序时,我发布了关于在iOS键盘上处理回车键的正确方法。现在我需要弄清楚键盘上方的工具栏上有上一步/下一步和完成按钮。我一直在使用以下网站上的一个示例:输入附件视图

这个例子很有效,但我想使用UIToolbar和UIBarButtonItem,而不仅仅是一个带按钮的常规视图。我试过各种组合,但都不管用。这是我迄今为止所拥有的。

标题:

#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

来源:

#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

当我启动应用程序时,我得到:

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

我的假设是,我没有正确地分配其中一个元素。我还想知道我是否需要在类中为按钮设置字段,或者这些字段是否可以添加到工具栏中。我在头中放了一行,这样我就不必把所有的方法都放在文件的开头。还不知道语法,无法像在C.中那样转发声明方法

谢谢。

更新:

因此,我对createInputAccessoryView进行了一些更改。我现在使用addItems来添加按钮。我将按钮变量设为局部变量(但与以前相同的问题)。好消息是应用程序不再崩溃,坏消息是工具栏显示,但没有任何按钮。不知道我还需要做什么才能真正显示按钮。我看到的所有例子都是相似的。

-(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不是UIView子类,因此不能将其添加为UIToolbar的子视图。相反,使用工具栏上的– setItems:animated:方法来添加这些按钮。

不确定是否为时已晚。我提出了在UIKeyboard中添加UIToolbar的解决方案,键盘类型随着UITextField内容的变化而变化,并在Github中用"Previous"、"Next"one_answers"Done"处理UIBarButtonItem。和如果在表视图的不同部分使用TextFields,则会变得更加棘手。

我在当前项目中成功地使用了您的代码,在UIDatePicker的顶部添加了工具栏,该工具栏由UITableView中的文本字段启动。我使用的是静态单元格。

它对我有用。

我将UITextFields作为IBOutlets,并且仅使用此代码设置InputAccessoryView

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

"下一个"one_answers"上一个"按钮的作用就像一个符咒(但只在桌子下面的路上)。当我返回时,我仍然需要手动将表格滚动到顶部。出于某种原因,UITableViewController只处理向下滚动的场景,我觉得这很奇怪,但这是我之前的代码片段。

- (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];
}    
}

我认为您的按钮是不可见的,因为以下代码:

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

尝试使用

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

问题一定出在添加此子附件视图的位置。

最新更新