Swift - 为tableView中的每个单元格添加一个复选框

时间:2015-10-24 19:20:40

标签: ios iphone xcode swift

我已经创建了一个表视图,允许用户将任务添加到表视图中,但现在我需要在每个任务前添加一个复选框,以便用户可以选择她/他想要的任务发送到其他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?' does not have a member named '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

    }

4 个答案:

答案 0 :(得分: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!
}

答案 1 :(得分: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中设置您的单元格,如下所示:

Custom cell

Identifier

我认为你的方法可能比必要的更困难。当你有一个UITableViewCell时,标准(不是自定义的)允许文本和图像。如果通过Interface Builder(或以编程方式)设置图像,则可以设置法线和突出显示的图像值。这将在选择单元格时使用所选图像,而在不选择单元格时使用另一个图像。

这也意味着现在常规选择操作就足够了,使整个表视图单元成为一个热点,您可以非常简单地通过内置的委托和函数获取所选单元格以及用于选择和取消选择的事件。 / p>

对于不属于Plain 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的工作流程协同工作?

答案 2 :(得分:0)

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

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

表格视图中可能有几种不同类型的单元格(例如用户信息单元格,任务单元格等)。为了理解表视图应该从缓存创建/获取的单元格类型,使用reuseIdentiferreuseIdentifer表示一种细胞。所以,应该有一些方法告诉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)

并按照您的问题自定义此单元格。

答案 3 :(得分:0)

您是否使用界面构建器将UITableViewCell的类型更改为自定义UITableViewCell

  

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

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

您还需要为标题添加2个UILabel,并为细节添加一个UILabel,并将它们连接起来。