向 UITextField 键盘添加取消按钮

Posted

技术标签:

【中文标题】向 UITextField 键盘添加取消按钮【英文标题】:Adding a cancel button to UITextField keyboard 【发布时间】:2012-06-26 16:15:08 【问题描述】:

有没有办法在为UITextField 显示的键盘上添加一个取消按钮?查看UITextInputTraits 协议参考,我找不到任何东西,包括尝试不同的键盘类型。

【问题讨论】:

【参考方案1】:

您可以创建一个输入附件视图,它可以在键盘上方显示一个 UIToolBar,然后在其中添加一个取消按钮。请查看以下 inputAccessoryView 属性的文档链接。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextField_Class/Reference/UITextField.html

这是我为 TextView 所做的一个示例。从“textViewDidBeginEditing”调用创建输入附件视图方法。然后它创建输入附件视图,在我的例子中添加了三个按钮和一个空格键。

希望对你有帮助。

-(void)textViewDidBeginEditing:(UITextView *)textView 

[self createInputAccessoryView];
[textView setInputAccessoryView:_inputAccessoryView];
self.myTextView = textView;  

-(void)createInputAccessoryView 

_inputAccessoryView = [[UIToolbar alloc] init];
_inputAccessoryView.barStyle = UIBarStyleBlackOpaque;
[_inputAccessoryView sizeToFit];

_inputAccessoryView.frame = CGRectMake(0,_collageView.frame.size.height - 44, _collageView.frame.size.width, 44);

UIBarButtonItem *fontItem = [[UIBarButtonItem alloc] initWithTitle:@"Font"
                                                             style:UIBarButtonItemStyleBordered
                                                            target:self action:@selector(changeFont:)];
UIBarButtonItem *removeItem = [[UIBarButtonItem alloc] initWithTitle:@"Remove"
                                                             style:UIBarButtonItemStyleBordered
                                                            target:self action:@selector(removeTextView:)];
//Use this to put space in between your toolbox buttons
UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                          target:nil
                                                                          action:nil];
UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                             style:UIBarButtonItemStyleDone
                                                            target:self action:@selector(dismissKeyBoard:)];

NSArray *items = [NSArray arrayWithObjects:fontItem,removeItem,flexItem,doneItem, nil];
[_inputAccessoryView setItems:items animated:YES];
[_myTextView addSubview:_inputAccessoryView];

【讨论】:

谢谢你,虽然如果你只是做一个取消按钮,在UITextField旁边放一个取消UIBarButtonItem不会在没有附件视图的情况下完成同样的事情吗? 想一想,这正是我会做的。这是一个非常好的答案,它肯定解决了我的问题,然后将其标记为已接受。 @kevinhorgan 为什么不立即将 self.myTextView 分配给输入属性?【参考方案2】:

我刚刚在 Interface Builder 中将 UIToolbar 放入我的视图控制器中,然后:

@property IBOutlet UIToolbar *keyboardAccessory;

-(void) viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];
    // this is so I can edit it in Interface Builder, but it doesn't show in the view
    [keyboardAccessory removeFromSuperview];


-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField 
    textField.inputAccessoryView = keyboardAccessory;
    return YES;


-(IBAction) pressedCancelButton 
    [self.view endEditing:YES];

瞧!

【讨论】:

【参考方案3】:

安德鲁,最近怎么样?是迪玛 R!

据我所知,没有什么好方法可以做你想做的事。您可以轻松地从 here 列出的内置类型中选择一种

typedef enum 
   UIReturnKeyDefault,
   UIReturnKeyGo,
   UIReturnKeyGoogle,
   UIReturnKeyJoin,
   UIReturnKeyNext,
   UIReturnKeyRoute,
   UIReturnKeySearch,
   UIReturnKeySend,
   UIReturnKeyYahoo,
   UIReturnKeyDone,
   UIReturnKeyEmergencyCall,
 UIReturnKeyType;

您可以做的是在包含取消按钮的键盘顶部添加一个视图,或者尝试遍历视图层次结构并以这种方式在按钮上覆盖您想要的内容(尽管这种方法不可靠)。不幸的是,这是 Apple 尚未提供太多自定义的一件事。

编辑:实际上我认为我从一开始就误读了您的问题,因为无论如何您都不希望取消按钮作为主要的返回按钮。在这种情况下,输入附件视图绝对是要走的路。

【讨论】:

哇,多么复古,很高兴在这里见到你,伙计。并感谢您的回答。是的,我想给用户一个额外的取消按钮,以防他们想取消文本输入。 Kevin Horgan 的答案是您想要的答案,这是实现这一目标的正确方法。

以上是关于向 UITextField 键盘添加取消按钮的主要内容,如果未能解决你的问题,请参考以下文章

为多个 UITextField 使用 inputAccessoryView UIToolbar

UITextField - 检测内置 iPhone 键盘上的输入?

当用户按下其他控件/空格时,如何取消对UITextField的聚焦?

在键盘上方添加 UITextField

工具栏上一个和下一个按钮逻辑

acessoryView 内的 UITextField -- 清除按钮未检测到触摸