我需要檢測,如果按鈕被點擊的的UITableViewController問題檢測按鈕cellForRowAt
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let LikesBtn = cell.viewWithTag(7) as! UIButton
}
我需要檢測,如果按鈕被點擊的的UITableViewController問題檢測按鈕cellForRowAt
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let LikesBtn = cell.viewWithTag(7) as! UIButton
}
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
}
當按下按鈕時,調用回調。索引路徑被捕獲。
第一步: 讓子類爲您的自定義的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)")
}
}
下面是我用:
首先初始化按鈕爲Outlet
和action
您TableViewCell
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
}
}
不能同意更多,我也在我的項目中使用它,像魅力 –
如果表視圖支持刪除,插入或移動的能力,請不要使用索引路徑作爲標記行。 – rmaddy
@rmaddy如果表視圖可以插入刪除或移動行,那麼它會重新加載自己,所以標籤將再次初始化,並且按鈕將具有正確的索引他們不? (我沒有檢查它,但我相信它不會有問題) –
很酷。我第一次看到這個。 – Shades
它工作完美,謝謝 –