2017-11-11 136 views
0

我有一個表格視圖,上面有一個搜索欄。我想要實現以下行爲:當輕敲搜索欄,然後用戶點擊其他任何地方時,搜索欄將成爲第一響應者(鍵盤被隱藏),但同時,表視圖的單元格沒有被選中。我不使用其他視圖進行搜索。這是我的一個搜索欄表視圖的樣子(我知道,有一個問題與表視圖的分隔符,當我跑我在模擬器項目想不通爲什麼。):如何在不選擇表格視圖的單元格的情況下將搜索欄作爲第一響應者?

enter image description here

目前,當我點擊其他地方時,搜索欄成爲第一響應者的辭職,但問題是,單元格也被選中。這樣可以,但有時候,當我有更復雜的單元格時(不像圖像中的單元格),視圖之間的轉換並不是非常平滑。如果你知道如何使轉換順利進行,那也可以,或者,如果有關實現上述行爲的建議,我將不勝感激。

+0

您是否嘗試過滑動手勢?向下滑動即可解散 – Mannopson

+1

全屏(全屏)打開模擬器。這不是分離器不存在的問題! – Lion

+0

@Lion,我做到了。當我滾動時,一些分隔符出現,而其他分隔符消失。 –

回答

1

這樣做的另一種方法是正確實施您的tableView didSelectRow委託方法。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if searchBar.isFirstResponder { 
     searchBar.resignFirstResponder() 
     tableView.deselectRow(at: indexPath, animated: false) 
     return 
    } 

    // perform your actions (present/push controller, etc.) 
} 

如果您嘗試在真實設備上測試您的應用程序,您將會看到,tableView中的分隔符沒有問題。這只是模擬器問題:)

+0

是的,我知道分隔符的行爲就像只在模擬器上那樣。有時候我覺得我是唯一一個和他們有這個問題的人) –

+0

這是行不通的。轉換仍然被調用。我還嘗試使用'if'語句來檢查搜索欄是不是'prepare(for:sender:)'方法中的第一響應者,但無論如何都會被調用。 –

+1

如果你正在設置Storyboard中的Triggered Segues,那麼情況就是這樣。打開它,從cell中移除segue並在'didSelectRowAt'方法中的if語句之後手動執行它(用適當的segue標識符調用'performSegue') –

2

UITapGestureRecognizer放在您的表格視圖上以響應水龍頭。

默認情況下,將水龍頭識別器設置爲禁用。

tapRecognizer.isEnabled = false 

當搜索欄變爲活動狀態時,重新啓用水龍頭識別器。

tapRecognizer.isEnabled = false 

當它識別到輕敲時,通過退出搜索欄的第一個響應者來關閉鍵盤。另外請確保禁用水龍頭識別器,以便像往常一樣選擇表格視圖單元格。

@objc private func handleTap(recognizer: UITapGestureRecognizer) { 
    searchBar.resignFirstResponder() 
    recognizer.isEnabled = false 
} 
+1

我認爲這是一個正確的解決方案! – Mannopson

+0

我應該將「UITapGestureRecognizer」添加到表格視圖本身還是添加到視圖控制器?當我將它添加到一個VC,並按照你所說的做,它仍然選擇該行。也許我做錯了什麼? –

+0

@TigranIskandaryan嘗試將其添加到表視圖。如果這不起作用,您可以使用與表格視圖相同的框架在表格視圖上方創建新視圖。將它的背景色設置爲'.clear'並將識別器添加到該視圖。 – nathan

相關問題