向 tableView 中的每个单元格添加复选框

问题描述 投票:0回答:4

我已经制作了一个表格视图,允许用户将任务添加到表格视图中,但现在我需要在每个任务前面添加一个复选框,以便用户可以选择她/他想要发送到的任务另一个 viewController。

谷歌搜索后,我意识到swift中没有checkBox或radioButton,我应该创建自己的“boxChecked.png”和“boxUnchecked.png”,

这是我的一段代码,它给了我一个错误:

if (selectedIndex == indexPath) {
    cell.radioButton?.setImage(UIImage(named: "boxChecked"),forState:UIControlState.Normal)
} else {
    cell.radioButton?.setImage(UIImage(named: "boxUnchecked"),forState:UIControlState.Normal)
}

它给我的错误是:

'UITableViewCell?'没有名为“radiobutton”的成员

即使我尝试创建一个名为 TableViewCell 的类(它是 UITableViewCell 的子类),并在其中声明变量 radioButton ,如下所示:

 @IBOutlet weak var radioButton: UIButton!

但还是没成功。

这是 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) 的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
    
    if (selectedIndex == indexPath) {
        cell.radioButton?.setImage(UIImage(named: "boxChecked"),forState:UIControlState.Normal)
    } else {
        cell.radioButton?.setImage(UIImage(named: "boxUnchecked"),forState:UIControlState.Normal)
    }

    cell.textLabel?.textAlignment = .Right
    cell.detailTextLabel?.textAlignment = .Left
    cell.textLabel?.text = taskMgr.tasks[indexPath.row].name
    cell.detailTextLabel?.text = taskMgr.tasks[indexPath.row].score

    return cell
    
    //let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Default")
   // cell.textLabel?.text = taskMgr.tasks[indexPath.row].name
   // cell.detailTextLabel?.text = taskMgr.tasks[indexPath.row].desc
   //return cell
}
ios swift uitableview
4个回答
0
投票

你有一个

UITableView
。它使用单元格来显示内容。单元有一个内置的默认实现:
UITableViewCell
。为了自定义
UITableViewCell
外观,我们创建自定义单元格,就像您对
TableViewCell
类所做的那样。如果你删除了它,请将其恢复。

UITableView
重复使用单元以提高效率。当单元格离开屏幕时,它会被保存,并且当表视图稍后需要相同类型的单元格时,它不会每次都重新创建它。它从缓存中获取它(如果它不为空)。

表格视图中可能有几种不同类型的单元格(例如用户信息单元格、任务单元格等)。为了了解表视图应该从缓存创建/获取哪种类型的单元格,使用

reuseIdentifer
reuseIdentifer
表示一种细胞。因此,应该有某种方式告诉
tableView
,当我们请求
"RadioButtonCell"
(例如)时,我们希望它创建一个具有类
TableViewCell
(您的自定义子类)的单元格。

有几种方法可以做到这一点。它可以通过故事板来完成,也可以通过代码来完成。如果您的单元格有与之关联的

xib
(接口文件),您可以使用

来完成此操作
tableView.registerNib(UINib(nibName: "TableViewCell", bundle: nil)), forCellReuseIdentifier: "RadioButtonCell")

如果您没有为其创建接口文件,您可以使用

tableView.registerClass(..., forCellReuseIdentifier: ...)

方法。

您可以注册一次 nib(例如,在 viewDidLoad 内部)。 然后稍后在

cellForRowAtIndexPath
你会:

var cell: TableViewCell = tableView.dequeueReusableCellWithIdentifier("RadioButtonCell)

并按照您在问题中所做的那样自定义此单元格。


0
投票

您是否使用界面生成器将

UITableViewCell
的类型更改为您的自定义
UITableViewCell

选择您的单元格 > 在右侧窗格中选择 Identity Inspector > 将类更改为您的自定义 UITableViewCell 类名称。

您还需要将复选按钮视图与自定义类中的插座连接起来。

您还需要添加 2 个 UILabels,一个用于标题,一个用于详细信息,并将它们连接起来。


0
投票

试试这个代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellIdentifier = "cell"
    var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? TableViewCell
    if cell == nil {
        cell = TableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: cellIdentifier)

    }
    if (selectedIndex == indexPath) {
        cell!.radioButton?.setImage(UIImage(named: "boxChecked"),forState:UIControlState.Normal)
    } else {
        cell!.radioButton?.setImage(UIImage(named: "boxUnchecked"),forState:UIControlState.Normal)
    }

    cell!.textLabel?.textAlignment = .Right
    cell!.detailTextLabel?.textAlignment = .Left

    cell!.textLabel?.text = taskMgr.tasks[indexPath.row].name
    cell!.detailTextLabel?.text = taskMgr.tasks[indexPath.row].score
    return cell!
}

0
投票

如果您使用 Interface Builder,您应该像这样实例化您的自定义表格视图单元格:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCellWithIdentifier("IdentifierInInterfaceBuilder") as? MyCustomTableViewCell else {
        return UITableViewCell()
    }

    return cell
}

在 IB 中设置您的单元格,如下所示:


我认为你的方法可能比必要的更困难。当您有 UITableViewCell 时,标准(不是自定义的)允许文本和图像。如果您通过 Interface Builder(或以编程方式)设置图像,则可以设置正常图像值和“突出显示”图像值。每当选择单元格时,这将使用所选图像,而当未选择单元格时,将使用另一个图像。 这也意味着现在常规的选择操作就足够了,使整个表格视图单元格成为热点,您可以非常简单地获取选定的单元格以及通过内置委托和函数选择和取消选择的事件。

对于不属于普通 UITableViewCell 可能性的更复杂的方法,您可以使用 UIImageView 的突出显示值,并在选择后或第一次加载它时更改它。

class ExampleTableViewCell: UITableViewCell { @IBOutlet var checkMark: UIImageView? override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) checkMark?.highlighted = selected } }

您是否看到它需要的代码有多么少以及它如何与 UITableView 的工作流程配合使用?

© www.soinside.com 2019 - 2024. All rights reserved.