2017-09-23 85 views
0

我需要檢測,如果按鈕被點擊的的UITableViewController問題檢測按鈕cellForRowAt

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

let LikesBtn = cell.viewWithTag(7) as! UIButton 

} 

回答

4

Swift中最簡單和最有效的方式是回調閉包。

  • 子類UITableViewCell,該viewWithTag的方式來識別UI元素已經過時。
  • 將自定義單元格的類設置爲子類的名稱,並在Interface Builder中將標識符設置爲ButtonCellIdentifier

  • 添加callback屬性。

  • 添加動作並將按鈕連接到動作。

    class ButtonCell: UITableViewCell { 
    
        var callback : (()->())? 
    
        @IBAction func buttonPressed(_ sender : UIButton) { 
         callback?() 
        } 
    } 
    
  • cellForRow分配回調到自定義單元格。

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCell(withIdentifier: "ButtonCellIdentifier", for: indexPath) as! ButtonCell 
        cell.callback = { 
         print("Button pressed", indexPath) 
        } 
        return cell 
        } 
    
  • 當按下按鈕時,調用回調。索引路徑被捕獲。

+0

很酷。我第一次看到這個。 – Shades

+0

它工作完美,謝謝 –

0

第一步: 讓子類爲您的自定義的UITableViewCell,還註冊協議。

事情是這樣的:

protocol MyTableViewCellDelegate: class { 
    func onButtonPressed(_ sender: UIButton, indexPath: IndexPath) 
} 

class MyTableViewCell: UITableViewCell { 

    @IBOutlet var cellButton: UIButton! 

    var cellIndexPath: IndexPath! 
    var delegate: MyTableViewCellDelegate! 


    override func awakeFromNib() { 
     super.awakeFromNib() 

     cellButton.addTarget(self, action: #selector(self.onButton(_:)), for: .touchUpInside) 
    } 

    func onButton(_ sender: UIButton) { 
     delegate.onButtonPressed(sender, indexPath: cellIndexPath) 
    } 

} 

在你TableViewController,確保它符合你剛剛創建協議 「MyTableViewCellDelegate」。

請看下面的代碼以獲得更好的理解。

class MyTableViewController: UITableViewController, MyTableViewCellDelegate { 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     if let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as? MyTableViewCell { 

      cell.cellIndexPath = indexPath 
      cell.delegate = self 

      return cell 
     } else { 
      print("Something wrong. Check your cell idetifier or cell subclass") 
      return UITableViewCell() 
     } 
    } 

    func onButtonPressed(_ sender: UIButton, indexPath: IndexPath) { 
     print("DID PRESSED BUTTON WITH TAG = \(sender.tag) AT INDEX PATH = \(indexPath)") 
    } 
} 
2

下面是我用:

首先初始化按鈕爲OutletactionTableViewCell

class MainViewCell: UITableViewCell { 

@IBOutlet weak var testButton: UIButton! 

@IBAction func testBClicked(_ sender: UIButton) { 

    let tag = sender.tag //with this you can get which button was clicked 

} 



} 

然後在你主控制器在cellForRow函數只是初始化標籤的按鈕是這樣的:

class MainController: UIViewController, UITableViewDelegate, UITableViewDataSource, { 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! MainViewCell 


     cell.testButton.tag = indexPath.row   

     return cell 
    } 

} 
+0

不能同意更多,我也在我的項目中使用它,像魅力 –

+0

如果表視圖支持刪除,插入或移動的能力,請不要使用索引路徑作爲標記行。 – rmaddy

+0

@rmaddy如果表視圖可以插入刪除或移動行,那麼它會重新加載自己,所以標籤將再次初始化,並且按鈕將具有正確的索引他們不? (我沒有檢查它,但我相信它不會有問題) –