簡體   English   中英

UITableViewCell 中的按鈕在 ios 7 下沒有響應

[英]Button in UITableViewCell not responding under ios 7

我有一個 tableview,每個單元格包含一個按鈕。 它在所有 iOS 版本中都運行良好,但 7。我不知道發生了什么。 該單元在一個 xib 文件中構建。

誰能給我一些建議? 提前致謝。

對我有用的是:

contentView.userInteractionEnabled = NO;

從筆尖加載我的自定義單元格后調用。 在創建在 nib 文件中定義的視圖之后,看起來這個內容視圖被創建並設置為頂級子視圖。

從 nib 加載單元格后調用[cell bringSubviewToFront:button]為我解決了這個問題。

我也遇到過這個問題,我對 stackoverflow 和 internet 上的不同答案做了很多研究,解決方案因問題的來源而異。 在大多數情況下,您需要對應該執行用戶操作(點擊/單擊等)的元素執行以下操作:
myButton.userInteractionEnabled = YES;

特別是對於 UILabel/UIImageView,默認情況下userInteractionEnabled標志是NO

如果您正在從 xib 加載視圖,您需要確保從自定義單元格視圖、內容視圖和您希望啟用用戶操作的元素都選中復選框:
在此處輸入圖片說明

在上面的示例中, DeviceViewCellContent ViewButton元素都選中了“啟用用戶交互”復選框。
如果自定義單元格實現為 UITableViewCell 的子類,並且自定義單元格視圖是從另一個 xib 文件動態加載的,則您必須再做一件讓大多數人感到困惑的事情,但我稍后會解釋原因:
在自定義單元格的初始化方法中,需要進行如下操作:
self.contentView.userInteractionEnabled = NO

其中self是您創建的 UITableViewCell 的子類。 同樣,如果自定義單元格是作為 UITableViewCell 的子類實現的,並且自定義單元格視圖是從另一個 xib 文件動態加載的,則需要執行上述操作。 這是解釋:

self.contentView與您在 Interface Builder 中看到的Content View ,它是由系統創建的default content view ,位於自定義單元格視圖中的所有其他視圖/元素的頂部,並且它掩蓋了其余視圖視圖層次結構。 因此,在自定義單元格視圖中的 UI 元素可以接收用戶交互事件之前,您需要為其禁用用戶交互。 希望這可以幫助。 如果您有更好的解釋,我很想聽聽:-)​​。 再次是我的觀察,可能還有其他原因。 歡迎討論!

問題是您的筆尖不包含自 iOS 8 SDK 以來所要求的 contentView(我是根據經驗編寫的,沒有可行的來源,抱歉)。

當您將UITableViewController添加到故事板時,會自動將 UITableViewCell 添加到它的UITableView 如果你看看這個UITableView ,你會在其中看到一個contentView

因此,當您子類化UITableViewCell並使用 .xib 創建它時,您必須單擊並拖動UITableViewCell到 xib 而不是默認的UIView 然后不要忘記將 File Owner 類和UITableViewCell類設置為您的子類。

這個問題的解決方法是;

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    
cell.bringSubviewToFront(cell.YOUR_UIView)    
}

這對我有用。

我遇到了同樣的問題。 原來我在 IB 中創建了一個 UIView 對象,然后將它的類設置為 UITableViewCell 的子類。

因為我最初在 IB 中創建的對象是一個 UIView,所以直到運行時才添加 UITableViewCell contentView,這恰好在我的 UIButton 之上,使它們無法選擇。

很明顯,有很多事情可能會出錯,一些修復程序適用於某些 iOS 版本,而不適用於其他版本。

我的問題是我有一個 UIButton,它不是 cell.contentView 的直接子視圖(即它是子視圖的子視圖)。 我必須將我的按鈕直接添加到 cell.contentView 以便它可以被點擊。 (iOS v8+)

我的細胞輪廓

就我而言,我希望用戶與之交互的所有內容都在 ContentView 之外。 此外,我不希望單元格在被選中時突出顯示。

所有標簽(名稱、類別等)都直接位於“內容視圖”下。 WebsiteButton 不在“內容視圖”下,而是在“本地目錄表單元格”下。

在我的 tableViewController 方法 tableView:cellForRowAtIndexPath: 我有以下代碼: cell.contentView.userInteractionEnabled = NO;

這就是全部,用戶可以與按鈕進行交互。 我不使用 [cell becomeSubviewToFront:cell.websiteButton];

我一直遇到同樣的問題。 原因是

self.contentView.Frame.size.height

總是 44。

有一個建議,您可以在覆蓋方法self.frame self.contentView.Frame設置為self.frame - (void)layoutSubviews問題將得到解決

正如其他人指出的那樣,始終將子視圖添加到單元格的內容視圖中。 如果您覆蓋了layoutSubviews方法,請確保調用超級實現。 忘記調用 super 實現會產生意想不到的結果。

我的故事板中原型單元格中的 UIButton 有同樣的問題。 我通過檢查原型單元上的“啟用用戶交互”來解決它。 這適用於 iOS 7.1。

我在這里沒有看到的最明顯的錯誤是你必須有一個 selectedBackgroundImage 來讓 UIButton 在被選中時看起來不同。 這些不像 UITableViewCells。

myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)

我已經繼承了 UITableViewCell 並通過更改此代碼解決了它:

addSubview(myButton)

對此:

contentView.addSubview(myButton)

在我的 UITableViewCell 子類中。

我在 UITableViewCell 和 UICollectionViewCell 上都遇到了類似的問題。 要遵循的幾個步驟:

  1. 始終將子視圖添加到單元格視圖的內容視圖而不是單元格視圖本身
  2. 如果您要添加容器視圖(其中包含您的按鈕),請禁用容器視圖的自動布局並僅對容器視圖內的內容啟用自動布局。 為容器視圖使用框架布局。

簡而言之,TableView/CollectionView 單元格不能采用啟用了自動布局的可操作子視圖(UIButton、UISegmentedControl)。 如果您需要它,請禁用自動布局並提供框架(或)將它們放在容器視圖中(容器視圖應禁用自動布局)並將可操作的視圖(具有自動布局)作為子視圖添加到容器視圖.

就我而言,我還需要檢查單元格本身(不僅僅是 contentView)的“啟用用戶交互”。 但正如其他答案中所指出的,發生這種情況的原因可能有多種,所以我確信這不適用於每種情況。

在此處輸入圖片說明

當您使用 Interface Builder (Storyboard) 時,請務必從Content View選中User Interaction Enabled復選框

這些答案都不適合我。

我能夠解決這個問題的唯一方法是將表格單元格選擇從單個設置為無。 在那之后,我能夠收到按鈕回調。

足夠連線,對我來說實際的解決方案是轉到故事板,選擇單元格中的 contentview,然后檢查“userInteractionEnabled”...否則即使您在按鈕或單元格上啟用了 userInteraction,contentview 也將始終阻止該操作.

我對那個實現了一些內部功能並處理自我的單元有透明的看法。

我檢查了所有內容,但我犯了一個愚蠢的錯誤,在情節提要中,我的按鈕的超級視圖低於其他視圖。 所以觸摸沒有傳遞到我的按鈕。

我的問題是我將UIButton添加為UIImageView子視圖,默認情況下禁用了用戶交互。 所以我必須啟用它:

imageView.isUserInteractionEnabled = true

在 Swift 5 中,我創建了一個 UITableViewCell 類並創建了一個 UIButton。

class DashboardingGameTableViewCell: UITableViewCell {
    
    // MARK: Setup Views
    
    var showInteractiveButton: UIButton = {
        let interactive = UIButton()
        interactive.setTitle("", for: .normal)
        interactive.contentEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 10.0, right: 10.0)
        interactive.setImage(UIImage(systemName: "ellipsis"), for: .normal)
        interactive.tintColor = .white
        interactive.backgroundColor = .clear
        interactive.translatesAutoresizingMaskIntoConstraints = false
        
        return interactive
    }()
    ...

在我的

class DashboardingGameViewController: UIViewController, UITableViewDelegate, UITableViewDataSource...

UIButton 不可點擊

因為它有效我必須做...

在 DashboardingGameViewController 上:UITableViewCell...

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    
    contentView.isUserInteractionEnabled = false
    addSubview(showInteractiveButton)
...

在 DashboardingGameViewController 上:UIViewController、UITableViewDelegate、UITableViewDataSource...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: reusableIdentifier,
                                                            for: indexPath) as! DashboardingGameTableViewCell
        
        cell.showInteractiveButton.addTarget(self, action: #selector(interactiveGames(_:)), for: .touchUpInside) 
    ...
  
// MARK: - Private Funcs 
    
@objc private func interactiveGames(_ button: UIButton) {
                present(ShowInteractiveGameViewController(), animated: true, completion: nil)
}

如果您有自定義單元格類,只需在awakeFromNib()包含self.selectionStyle = .none

override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.selectionStyle = .none
    }

好的,我已經找到了解決此問題的方法,但這似乎是一個巨大的問題; 然而,這就是我所能想到的(這里沒有其他東西對我有用)。

在我的button上方,我添加了一個 UITextField,它委托給有問題的表格視圖單元格。 該 tableViewCell 實例實現-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField並返回NO

暫無
暫無

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

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