簡體   English   中英

iOS 7:如何隱藏鍵盤上的“完成”按鈕

[英]iOS 7: How to hide the DONE button on the keyboard

我正在嘗試為用戶提供一種消除鍵盤的方法,無論是在鍵盤外部單擊還是在鍵盤本身上具有“完成”按鈕。

我已經創建了“完成”按鈕,並且在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但是當我觸摸它們時,僅當我觸摸父UIView時, touchesBegan事件不會觸發,該事件不可見,因為它已被UISearchBarUITableView覆蓋。 我必須觸摸兩者之間的微小空間才能觸發事件。

如何使我的touchesBegan方法適用於屏幕上的任何對象? 為什么我的“完成”按鈕沒有顯示在iOS 7中?

為什么我的“完成”按鈕未在iOS 7中顯示?

您的“完成”按鈕未顯示,因為您不應修改的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];
        }
    }      
}

(此代碼來自此SO答案 。)

但是, 不建議使用這種方法,因為它可能會在iOS 7.1中再次中斷。 作為遞歸方法,它也可能更具彈性。

如何使我的touchesBegan方法適用於屏幕上的任何對象?

觸摸事件由頂視圖處理,因此,如果其他視圖不希望它們,則UIView只會獲取它們。 最簡單的方法是制作一個不可見的UIButton,將其覆蓋整個屏幕,如果輕按了,則關閉鍵盤並卸下按鈕。

使用以下方法並在iOS7中的鍵盤上獲取“完成”按鈕。

示例代碼在這里

使用此方法后的“完成”按鈕的屏幕快照在此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM