2016-12-27 81 views
0

我有一個自定義的UITableViewCell在我所連接的使用界面生成器從自定義的UITableViewCell在夫特檢測的UIButton 3

@IBOutlet var myButton: UIButton! 

我的UIButton下的UITableViewController的小區配置,我有以下代碼:

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

var customCell = tableView.dequeueReusableCell(withIdentifier: self.MY_CELL_IDENTIFIER, for: indexPath) as! myCustomCell 

// CONFIGURE OTHER CELL PARAMETERS 

customCell.myButton.tag = indexPath.row 

customCell.myButton.addTarget(self, action: #selector(myButtonPressed), for: UIControlEvents.touchUpInside) 

return customCell 

} 

最後,我

private func myButtonPressed(sender: UIButton!) { 
     let row = sender.tag 
     print("Button Sender row: \(row)")    
    } 

此代碼不能正常工作,除非我函數的定義改爲如下:

@objc private func myButtonPressed(sender: UIButton!) { 
      let row = sender.tag 
      print("Button Sender row: \(row)") 

     } 

是否有實現的UIButton的自定義的UITableViewCell斯威夫特3

+0

您是否試圖從界面構建器創建操作? – LopesFigueiredo

+0

溝私人關鍵字 –

+0

@LopesFigueiredo - 我沒有創建IBAction的原因是因爲會有多行,我將不得不檢測從哪個行按下按鈕。 –

回答

0

更好的方法你也可以使用委託來這樣做。

直接映射您的自定義UITableViewCell類中的IBAction按鈕。

在viewcontroller和On按鈕動作中實現委託方法從自定義單元調用委託方法。

4

我不是一個大風扇使用視圖tag s。而不是這樣,你可以使用你的viewController的委託模式在按鈕被擊中時得到通知。

protocol CustomCellDelegate: class { 
    func customCell(_ cell: UITableViewCell, didPressButton: UIButton) 
} 

class CustomCell: UITableViewCell { 
    // Create a delegate instance 
    weak var delegate: CustomCellDelegate? 

    @IBAction func handleButtonPress(sender: UIButton) { 
     self.delegate?.customCell(self, didPressButton: sender) 
    } 
} 

class ViewController: UIViewController { 
    @IBOutlet weak var tableView: UITableView! 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     var customCell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as! CustomCell 
     // CONFIGURE OTHER CELL PARAMETERS 

     //Assign the cell's delegate to yourself 
     customCell.delegate = self 
     return customCell 
    } 
} 

extension ViewController: CustomCellDelegate { 
    // You get notified by the cell instance and the button when it was pressed 
    func customCell(_ cell: UITableViewCell, didPressButton: UIButton) { 
     // Get the indexPath 
     let indexPath = tableView.indexPath(for: cell) 
    } 
} 
1

是的,有一個更聰明,更好的方法來做到這一點。你的方法的主要問題是隻有在沒有插入,刪除或移動單元操作的情況下才能工作。因爲任何這些操作都可以更改爲其他indexPath創建的單元格的de indexPath。

我使用的系統是這樣的:

1.-創建你的類MyCustomCell一個IBAction爲(大寫M.這是一類,所以命名爲正常)。

2.-將按鈕連接到該動作。

3.-聲明與至少一個協議MyCustomCellDelegate,一種方法

func myCustomCellButtonAction(_ cell:MyCustomCell) 

和將屬性添加到MyCustomCell

var delegate : MyCustomCellDelegate?  

4.-設置視圖控制器MyCustomCellDelegate

在MyCustomCell連接到按鈕的方法中調用委託方法:

delegate?.myCustomCellButtonAction(self) 

5.-在視圖控制器,在該方法cellForRowAt:

customCell.delegate = self 

6。 - 在視圖控制器中,在方法myCustomCellButtonAction中:

func myCustomCellButtonAction(_ cell: MyCustomCell) { 
    let indexPath = self.tableView.indexPathForCell(cell) 

    // ...... continue ..... 
} 
相關問題