iOS 7:如何隐藏键盘上的DONE按钮

时间:2013-11-08 21:48:05

标签: ios

我试图让我的用户解雇键盘,无论是通过键盘外部点击还是键盘本身都有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.
}

但是我的视图包含UISearchBarUITableView,但是当我触摸那些时,touchesBegan事件不会触发,只有当我触摸父UIView时才会触发,因为它由我的UISearchBar和我的UITableView覆盖。我必须触摸两者之间的微小空间来发射事件。

如何将touchesBegan方法应用于屏幕上的任何对象?为什么我的DONE按钮没有出现在iOS 7中?

2 个答案:

答案 0 :(得分: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,如果它被点击,则关闭键盘并移除按钮。

答案 1 :(得分:0)

使用以下方法&在iOS7中获得键盘上的Done按钮。

示例代码为here

使用此方法后,完成按钮的屏幕截图为here