gpt4 book ai didi

ios - 如何在 Swift 中的 UITableViewCell 上添加带有单击事件的按钮?

转载 作者:行者123 更新时间:2023-11-30 10:51:56 25 4
gpt4 key购买 nike

在我的主页中,我为 UITableViewCell 创建了一个 xib 文件。我正在从该 xib 文件加载单元格,并且它工作正常。

单元格内部有一些标签和按钮。我的目标是通过单击单元格上的按钮来更改标签。

我的代码如下

import UIKit


class SepetCell: UITableViewCell{

@IBOutlet var barcode: UILabel!
@IBOutlet var name: UILabel!
@IBOutlet var fav: UIButton!
@IBOutlet var strep: UIStepper!
@IBOutlet var times: UILabel!



@IBAction func favoriteClicked(sender: UIButton) {
println(sender.tag)
println(times.text)

SepetViewController().favorite(sender.tag)



}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}

override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
}
}

这是我的 xib 文件,后面的代码为 .swift。

主页中的代码如下:

  import UIKit
import CoreData

class SepetViewController: UIViewController, UITextFieldDelegate, UITableViewDataSource, UITableViewDelegate {

@
IBOutlet
var sepetTable: UITableView!
var barcodes: [CART] = []

let managedObjectContext = (UIApplication.sharedApplication().delegate as!AppDelegate).managedObjectContext

override func viewWillAppear(animated: Bool) {
if let moc = self.managedObjectContext {


var nib = UINib(nibName: "SepetTableCell", bundle: nil)
self.sepetTable.registerNib(nib, forCellReuseIdentifier: "productCell")
}
fetchLog()
sepetTable.reloadData()
}

func fetchLog() {

if let moc = self.managedObjectContext {
barcodes = CART.getElements(moc);
}
}



func tableView(tableView: UITableView, numberOfRowsInSection section: Int) - > Int {
return self.barcodes.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {


let cell = tableView.dequeueReusableCellWithIdentifier("productCell") as ? SepetCell


if cell == nil {
println("cell nil")

}



let product: CART
product = barcodes[indexPath.row]



cell!.barcode ? .text = product.barcode
cell!.name ? .text = product.name
cell!.fav.tag = indexPath.row

return cell!
}

func favorite(tag: Int) {



}
}

当我单击单元格内的“fav”按钮时。例如,我想将时间标签文本更改为任何内容。

当我单击收藏按钮时,事件将转到 SepetCell.swift favoriteClicked(sender: UIButton) 函数。

所以如果我尝试打电话:SepetViewController().favorite(sender.tag)

它将进入

func favorite(tag: Int) {

sepetTable.reloadData()

}

但是 sepetTable 消失后为零。我认为这是因为当我调用这个 SepetViewController().favorite(sender.tag) 函数时。它首先创建 SepetViewController 类。因此,由于未设置对象,因此它变为 null。

我怎样才能到达那个 sepetTable 或者解决这个问题的最佳方法是什么。

谢谢。

最佳答案

解决这个问题的流行模式是闭包和委托(delegate)。如果你想使用闭包,你可以这样做:

final class MyCell: UITableViewCell {
var actionBlock: (() -> Void)? = nil

然后

    @IBAction func didTapButton(sender: UIButton) {
actionBlock?()
}

然后在你的tableview委托(delegate)中:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier("MyCellIdentifier") as? MyCell
cell?.actionBlock = {
//Do whatever you want to do when the button is tapped here
}
<小时/>

一个流行的替代方案是使用委托(delegate)模式:

    protocol MyCellDelegate: class {
func didTapButtonInCell(_ cell: MyCell)
}

final class MyCell: UITableViewCell {
weak var delegate: MyCellDelegate?

然后

    @IBAction func didTapButton(sender: UIButton) {
delegate?.didTapButtonInCell(self)
}

..现在在您的 View Controller 中:

然后在你的tableview委托(delegate)中:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier("MyCellIdentifier") as? MyCell
cell?.delegate = self

并像这样添加对协议(protocol)的一致性:

extension MyViewController: MyCellDelegate {
didTapButtonInCell(_ cell: MyCell) {
//Do whatever you want to do when the button is tapped here
}
}

希望这有帮助!

关于ios - 如何在 Swift 中的 UITableViewCell 上添加带有单击事件的按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54375960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com