ios - swift tableview cell




-didSelectRowAtIndexPath:未被調用 (20)

所有好的答案,但還有一個要注意的...

(特別是當以編程方式創建UITableView時)

確保tableView可以通過設置[tableView setAllowsSelection:YES];來響應選擇[tableView setAllowsSelection:YES]; 或者刪除將其設置為NO任何行。

我正在編寫一個帶有標籤視圖內的表格視圖的iOS應用程序。 在我的UITableViewController ,我實現了-tableView:didSelectRowAtIndexPath:但是當我在運行時選擇一行時,該方法未被調用。 表視圖正在填充,所以我知道我的控制器中的其他tableView方法正在被調用。

有沒有人有任何想法,我可能已經搞砸了做到這一點?


以防萬一有人犯了和我一樣​​的愚蠢錯誤:

檢查一下你所期望的didSelect方法名稱是否可能被意外didDeselect以某種方式。 我花了大約兩個小時才發現...


你必須選擇這些選項

但如果你想讓uitableview在單擊時不突出顯示,那麼你應該在UITableViewCell屬性中進行更改...對於Selection選擇None選項..就像...


儘管已經接受了另一個答案,但我會為觀察此問題的人添加一個可能的問題和解決方案:

如果您打開了自動引用計數(ARC),您可能會發現,即使在將控制器分配為視圖的代理後,由於ARC正在刪除控制器,因此未收到控制器的視圖消息。 顯然,UITableView的委託指針並不算作ARC的參考,所以如果這是對它的唯一引用,控制器將被解除分配。 您可以通過在控制器上實現dealloc方法並在那裡設置斷點或NSLog調用來驗證是否發生了這種情況。

解決方案是在其他地方跟踪強大的控制器,直到您確定不再需要它為止。


可能導致問題的另一件事是不選擇選擇種類:

對於正常選擇應該是Single Selection ,不應該是No Selection


在我的情況下,我在加載時動態計算TableViewSuperView的高度。 由於計算錯誤, TableView被定位在SuperView之外。 TableView被畫得很好,但是所有的交互都被禁用了(並且didSelectRowAtIndexPath從未被調用過)。 非常難以檢測,因為沒有視覺指示TableView不“可訪問”。


在這種情況下,我遇到了兩件事。

  1. 你可能忘記實現UITableViewDelegate協議,或者在你的類和你的表視圖之間沒有代理插座。

  2. 你可能在你的行內有一個UIView,它是第一響應者,並將你的點擊帶走。 說一個UIButton或類似的東西。


好的,在我剛剛遇到這個問題時更新,我的問題與此處找到的稍有不同。

我查看了IB,發現我的委託WAS已設置,但它被錯誤地設置為VIEW而不是文件所有者(右鍵單擊表視圖以查看委託所指向的位置)。

希望能幫助別人



如果你的表視圖處於編輯模式(例如[tableView setEditing:YES animated:NO]; ),你需要設置tableView.allowsSelectionDuringEditing = YES;


如果您在UITableView的頂部添加了gestureRecognizer, didSelectRowAtIndexPath將不會被調用。

因此,您需要使用gestureRecognizer委託方法來避免在特定視圖中觸摸。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}

對於Xcode 6.4,Swift 1.2。 IB中的選擇“標籤”已更改。 我不知道如何以及為什麼。 將其設置為“單選”使我的表格視圖單元格再次可選。


我在桌面視圖中放置了一個UITapGestureRecognizer來關閉阻止didSelectRowAtIndexPath:的鍵盤被調用。 希望它能幫助別人。


我曾經也有過一樣的問題。 而且很難找到。 但在我的代碼中的某處是這樣的:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

它必須是return indexPath ,否則-tableView:didSelectRowAtIndexPath:不被調用。


我的問題是以上都不是。 跛腳。 但我想我會在這裡列出它,以便幫助某人。

我有一個tableViewController是我的“基礎”控制器,然後創建此控制器的子類。 我正在將所有代碼寫入“base”類的tableView:didSelectRowAtIndexPath例程中。 完全忘記,在我的所有子類中,默認情況下這個例程也被創建(儘管沒有代碼做任何事情)。 所以當我運行我的應用程序時,它運行代碼的子類版本,什麼也沒做,讓我感到難過。 所以當然,一旦我從子類中刪除例程,它就會使用mt“base”類例程,並且我正在運行。

我知道。 不要笑。 但是,也許這會為我失去的那個小時節省一些人...


我知道已經老了,問題已經解決,但有一個類似的問題,我認為這個問題與我的自定義UITableViewCell,但解決方案是完全不同的 - 我重新啟動XCode :)然後工作正常! 幾乎像Windows :)


注意故事板中的UITableView屬性,在我的情況下發生的情況是,故事板中的combox被選為“Selection:Single Selection”,但不允許方法didSelectRowAtIndexPath運行。


給我2分這一點。

我有一個自定義的UITableViewCell,並且有一個覆蓋整個單元格的按鈕,所以當觸摸發生時,按鈕被選中而不是單元格。

要么刪除按鈕,要么在我的情況下,我將按鈕上的User Interation Enable設置為false,這樣單元就是所選的一個。


這些答案都不適合我。 大約一個小時後,我發現了一件非常陰險的事情:

我在另一個表視圖的單元格中有一個表視圖。 我決定創建一個包含內部表格視圖的封閉視圖,等等。 我把這個視圖稱為contentView,並將它連接到xib中。

事實證明,UITableViewCell已經有了一個contentView,並且對它做了奇怪的事情。 當我將屬性重命名為mainContentView並將視圖重新連接到此重命名的屬性時,問題自行解決。


這可能僅限於我的情況,但我已經從備份中重新加載了一些文件,並且這些文件無法正常工作,包括這些。 在完全清潔之後(產品>清潔或Shift + Command + K)它工作。 可能有些東西在預編譯頭文件中搞砸了。 這對你來說不是問題,但值得一試。





didselectrowatindexpath