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

Ios Swift-向tableView中的每个单元格添加复选框,ios,iphone,xcode,swift,Ios,Iphone,Xcode,Swift,我已经创建了一个表视图,允许用户将任务添加到表视图中,但现在我需要在每个任务前面添加一个复选框,以便用户可以选择要发送给其他viewController的任务 在我用谷歌搜索之后,我意识到swift中没有复选框或单选按钮,我应该创建自己的“boxChecked.png”和“boxUnchecked.png” 下面是我的一段代码,它给了我一个错误: if (selectedIndex == indexPath) { cell.radioButton?.setImage(UIImage(na

我已经创建了一个表视图,允许用户将任务添加到表视图中,但现在我需要在每个任务前面添加一个复选框,以便用户可以选择要发送给其他viewController的任务

在我用谷歌搜索之后,我意识到swift中没有复选框或单选按钮,我应该创建自己的“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:nsindepath)的代码:

请尝试以下代码:

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!
}

如果您使用的是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的工作流程配合使用的?

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

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

表视图中可能有几种不同类型的单元格(例如用户信息单元格、任务单元格等)。为了理解表视图应该创建/从缓存中获取什么样的单元格,使用了
reuseIdentifer
<代码>重用标识符表示一种单元格。因此,应该有某种方法告诉
tableView
,当我们请求一个
“RadioButtonCell”
(例如),我们希望它创建一个具有类
TableViewCell
(您的自定义子类)的单元格

有几种方法可以做到这一点。它可以通过故事板完成,也可以通过代码完成。如果您的单元格有一个与之关联的
xib
(接口文件),则可以使用

tableView.registerNib(UINib(nibName: "TableViewCell", bundle: nil)), forCellReuseIdentifier: "RadioButtonCell")
tableView.registerClass(..., forCellReuseIdentifier: ...)
如果没有为它创建接口文件,可以使用

tableView.registerNib(UINib(nibName: "TableViewCell", bundle: nil)), forCellReuseIdentifier: "RadioButtonCell")
tableView.registerClass(..., forCellReuseIdentifier: ...)
方法

您可以注册NIB一次(例如,在viewDidLoad内部)。 然后在稍后的
cellforrowatinexpath
中执行以下操作:

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

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

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

选择您的单元格>在右侧窗格中选择标识检查器> 将类更改为自定义UITableViewCell类名

您还需要将check按钮视图与自定义类中的outlet连接起来


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

您需要将单元格转换为TableViewCell,显示
func tableView的所有代码(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)->UITableViewCell
Method我用代码更新了我的问题。第二行“TableViewCell(样式:UITableViewCellStyle.Subtitle,”并说:使用未声明的类型“TableViewCell”@NABS,你确定你确实创建了类TableViewCell作为UITableViewCell子类吗?是的,我创建了,但后来我删除了它,因为我一直收到相同的错误above@AlexanderGrebenshikov这不是创建表视图单元格的方法。您应该先注册它们,然后将它们设置为重复使用手机而不是每次都创建一个新手机的好处…@AlexanderGrebenshikov,哦,对了,我的不好,对不起。P.S.的确,我们用俄语交谈会更方便:)很遗憾这对社区没有好处:)谢谢,但我不知道我们是如何声明变量UIImageView的,以及它的确切位置?我是否必须声明两个图像视图,一个选中,另一个未选中?@IBOutlet表示Interface Builder Outlet。因此,您可以在Interface Builder中使用UITableView,并可以在其中添加表视图单元原型。这个原型可以有一个自定义类,如果你在原型单元格中添加UIImageView并将其连接到IBOutlet,你可以通过自定义单元格中的代码操作该图像。我已经有了标题标签,它们的添加和删除任务也在工作,除了选择功能仍然不起作用之外,我应该把“tableView.RegisterInB(UINib(nibName:“TableViewCell”,bundle:nil)),forCellReuseIdentifier:“RadioButtonCell”)”?我的意思是,在tableView函数中,或者独立地在新行上?我试着把它放在tableView中,它给了我一个错误,当我把它放在该函数之外时也是如此