2017-04-27 62 views
1

我正在開發一個SWIFT 3應用程序,在每個頁面中都有一個導航欄。導航欄左側還有一個按鈕。 我需要通過觸摸屏幕上的任何對象來放棄鍵盤。 我試着用通常的如何隱藏鍵盤快速按導航條

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.view.endEditing(true) 

    } 

,但它適用於除了導航欄視圖的所有其他部分。 我嘗試添加以下代碼:

self.navigationController?.navigationBar.endEditing(true) 

touchesBegan功能,但它沒有工作,因爲推測我沒有導航控制器,我只是說在故事板的搜索欄。

如何讓鍵盤在點擊導航欄時退出,包括導航欄中的按鈕?

這對我的應用程序很重要,因爲如下所示,這是用戶可以在不改變視圖的情況下點按的最大空間。

enter image description here

我需要在該地區的工作辭職包圍在黃色,包括箭頭所示的按鈕。

+0

你需要添加手勢爲此 –

+0

@ Anbu.Karthik可以請你解釋一下? –

回答

3

爲如

override func viewDidLoad() { 
    super.viewDidLoad() 
let hideKeyboard = UITapGestureRecognizer(target: self, action: #selector(self.navigationBarTap)) 
    hideKeyboard.numberOfTapsRequired = 1 
    navigationController?.navigationBar.addGestureRecognizer(hideKeyboard) 

    } 

並處理動作爲

func navigationBarTap(_ recognizer: UIGestureRecognizer) { 
    view.endEditing(true) 
    // OR USE yourSearchBarName.endEditing(true) 

} 
+0

'self.navigationBarTap'是指導航項嗎? –

+1

@toing_toing - 不需要處理手勢的方法名稱,如果需要,您可以自定義 –

1

調用此行您的按鈕操作的內部前,您所呼叫按鈕的菜單:

YourSearchOutlet.resignFirstResponder() 
1

嘗試導航欄上添加點觸手勢:

override func viewDidLoad() { 
     super.viewDidLoad() 

     let navSingleTap = UITapGestureRecognizer.init(target: self, action: #selector(self.tap(_:))) 
     navSingleTap.numberOfTapsRequired = 1 
     self.navigationController?.navigationBar.subviews[1].isUserInteractionEnabled = true 
     self.navigationController?.navigationBar.subviews[1].addGestureRecognizer(navSingleTap) 
     } 

    func tap() { 
     // do your work 
    } 
+0

這是在行嗎? – KKRocks

+0

按照接受的答案將'tap()'更改爲'tap(_ recognizer:UIGestureRecognizer)'後,我試過了,它工作。 –

1

子類UINavigationBar並將其設置爲故事板中導航欄的自定義類。

// NavigationBar.swift 

import UIKit 

class NavigationBar: UINavigationBar { 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.window?.endEditing(true) 
    } 

}