iOS 7:如何隐藏键盘上的 DONE 按钮
Posted
技术标签:
【中文标题】iOS 7:如何隐藏键盘上的 DONE 按钮【英文标题】:iOS 7: How to hide the DONE button on the keyboard 【发布时间】:2013-11-08 21:48:04 【问题描述】:我试图为我的用户提供一种关闭键盘的方法,无论是通过在键盘外部单击还是通过在键盘本身上设置一个 DONE 按钮。
我创建了一个完成按钮,它在 ios 6 上运行良好:
UIToolbar *keyboardToolbar;
keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height - 44, 320, 44)];
UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"dismiss_keyboard", nil) style:UIBarButtonItemStyleDone target:self action:@selector(dismissKeyboard)];
NSArray *items = [NSArray arrayWithObjects:flexItem,doneItem, nil];
[keyboardToolbar setItems:items animated:YES];
for (UIView *subview in [searchBar subviews])
if( [subview isKindOfClass:[UITextField class]] )
((UITextField*)subview).delegate=self;
((UITextField*)subview).inputAccessoryView = keyboardToolbar;
break;
但在 iOS 7 上找不到此按钮。
我也尝试使用用户可以点击键盘以外的任何地方并使其消失的方法:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
[super touchesBegan:touches withEvent:event];
//Code to dismiss keyboard.
但是我的视图包含一个UISearchBar
和一个UITableView
,但是当我触摸它们时touchesBegan
事件不会触发,只有当我触摸父 UIView 时才会触发,因为它被我的@987654326 覆盖而不可见@ 和我的UITableView
。我必须触摸两者之间的微小空间才能触发事件。
如何使我的touchesBegan
方法应用于屏幕上的任何对象?为什么我的 DONE 按钮在 iOS 7 中没有显示?
【问题讨论】:
【参考方案1】:为什么我的 DONE 按钮在 iOS 7 中没有显示?
您的 DONE 按钮未显示,因为您不应该修改的 UISearchBar 的内部结构已更改。 (这就是你不应该修改它的原因。)
如果你想继续这个不推荐的行为并让它工作,而不是检查它是否是 UITextField,你可以尝试检查它是否符合 UITextInputTraits,并遍历子视图的子视图:
for(UIView *subView in [searchBar subviews])
if([subView conformsToProtocol:@protocol(UITextInputTraits)])
// iOS 6
[(UITextField *)subView setReturnKeyType: UIReturnKeyDone];
else
// iOS 7
for(UIView *subSubView in [subView subviews])
if([subSubView conformsToProtocol:@protocol(UITextInputTraits)])
[(UITextField *)subSubView setReturnKeyType: UIReturnKeyDone];
(此代码来自this SO answer。)
但是,这种方法不推荐,因为它可能会在 iOS 7.1 中再次崩溃。作为递归方法,它也可能更具弹性。
如何使我的
touchesBegan
方法应用于屏幕上的任何对象?
触摸事件由顶视图处理,因此 UIView 只会在其他视图不想要它们时获取它们。这里最简单的方法是制作一个覆盖整个屏幕的不可见 UIButton,如果点击它,则关闭键盘并移除按钮。
【讨论】:
【参考方案2】:使用以下方法并在 iOS7 中获取键盘上的“完成”按钮。
示例代码是here。
使用此方法后完成按钮的屏幕截图为here。
【讨论】:
以上是关于iOS 7:如何隐藏键盘上的 DONE 按钮的主要内容,如果未能解决你的问题,请参考以下文章
如何在iOS 8上的Cordova / PhoneGap应用程序中隐藏键盘表格附件栏? [重复]