Swift tableview 单元格单选按钮实现

Posted

技术标签:

【中文标题】Swift tableview 单元格单选按钮实现【英文标题】:Swift tableview cell radio button implementation 【发布时间】:2018-09-18 20:09:43 【问题描述】:

我需要在 tableview 自定义单元格中放置一个单选按钮。每当用户单击 tableview 单元格或按钮时,单选按钮都需要工作。我尝试使用下面的代码,但没有很好地执行。

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

        let cell:TableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! TableViewCell

        cell.country.text = self.animals[indexPath.row]

        cell.selectionStyle = UITableViewCellSelectionStyle.none;

        if selectedRows.contains(indexPath)
        
            cell.radioButton.setImage(UIImage(named:"check.png"), for: .normal)
        
        else
        
            cell.radioButton.setImage(UIImage(named:"uncheck.png"), for: .normal)
        

        return cell
    

【问题讨论】:

什么不起作用?发生了什么?你预期会发生什么?在代码中放置断点会发生什么?阅读How to Ask 和minimal reproducible example 并更新您的问题。 【参考方案1】:

这是一个在UITableView 中创建单选按钮的绝佳解决方案,使用需要 代码的情节提要 - 并且有 2 个很棒的酷提示!!

确保您的表格视图设置为单选,并使用静态单元格

添加一个Basic单元格,将图像设置为未选中的按钮图像,并确保选择样式为Default

酷提示#1:单击并选择单元格的图像视图,然后将其突出显示的图像设置为选中状态。当单元格被突出显示或选择时,其中的图像视图将更改为显示其突出显示状态。

酷提示 #2: 接下来,将 UIView 拖到单元格的内容视图中,位于文本标签后面。由于您使用的是基本单元格,因此无法将其直接拖放到单元格中,您需要将其拖入左侧的文档大纲中。然后将其连接到单元格的 选定背景视图 插座。选择单元格(或突出显示)时,将在后台显示此视图。在这种情况下,我们将使用它来防止出现灰色背景,因此将其颜色设置为 Clear。请注意,视图的大小无关紧要,也无需设置任何约束 - 它会在运行时自动调整大小以匹配单元格。

最后,复制此单元格并更改每个单选按钮选项的文本。构建并运行,您就有了无代码单选按钮!

【讨论】:

太棒了。我会尝试在这里更新你。非常感谢! @阿什利米尔斯【参考方案2】:

在您的TableViewCell 类中,为什么不创建一个数据源元素并为其覆盖didSet。同样在UITableView 的数据源中,我会推荐一个数组,而不仅仅是String

我还没有编译下面的,所以这只是一个想法。

import UIKit

class TableViewCell : UITableViewCell 
    var data: Animal? 
        didSet 
            self.country.text = data.description
            if (data.isSelected) 
                self.radioButton.setImage(UIImage(named:"check.png"), for: .normal)
             else 
                self.radioButton.setImage(UIImage(named:"uncheck.png"), for: .normal)
            
        
    

在您的视图控制器中,您当然必须在点击一行时设置isSelected 属性。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    var animal = self.animals[indexPath.row]
    animal.isSelected = !animal.isSelected


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell:TableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! TableViewCell

    cell.data = self.animals[indexPath.row]

对于您的Animal,可能是这样的:

struct Animal 
    var description: String
    var isSelected: Bool

【讨论】:

您会因为在单元格上设置属性而不是直接更新其插座而获得赞成票。 我会在这里尝试更新你@Dennis White 非常感谢你

以上是关于Swift tableview 单元格单选按钮实现的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 状态在滚动带有多个部分的 tableview 时发生变化 - Swift

如何在swift 3中删除tableview中特定单元格的按钮

在 TableView 的自定义单元格中添加单选按钮并且无法访问外部

Swift - 实现tableView单选系统样式

Swift 3.0 TableView 单元格按钮

Swift 将按钮操作添加到 TableView 单元格