1

我试图为我的用户提供一种关闭键盘的方法,无论是通过在键盘外部单击还是通过在键盘本身上设置一个 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.
}

但是我的视图包含 aUISearchBar和 aUITableView但是touchesBegan当我触摸它们时事件不会触发,只有当我触摸父 UIView 时才会触发,它不可见,因为它被 myUISearchBar和 my覆盖UITableView。我必须触摸两者之间的微小空间才能触发事件。

如何使我的touchesBegan方法适用于屏幕上的任何对象?为什么我的 DONE 按钮没有在 iOS 7 中显示?

4

2 回答 2

1

为什么我的完成按钮在 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,如果点击它,则关闭键盘并移除按钮。

于 2013-11-08T22:03:38.477 回答
0

使用以下方法并在 iOS7 中的键盘上获取完成按钮。

示例代码在这里

使用此方法后完成按钮的屏幕截图在这里

于 2013-11-27T08:45:25.713 回答