到目前为止,我有一个使用多个选择行的tableView。除非我试图获得我选择的行数组,否则一切正常。
这是我的Stat.swift类:
class Stat: Equatable {
var statName: String = ""
var statCalendar: String = ""
var statEvents : [StatEvents] = []
}
struct StatEvents {
var isSelected: Bool = false
var name: String
var dateRanges: [String]
var hours: Int
}
func == (lhs: Stat, rhs: Stat) -> Bool {
return (lhs.statEvents == rhs.statEvents)
}
这是我的EventsViewController.swift类:
var currentStat = Stat()
var selectedMarks = [StatEvents]()
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.font = UIFont.systemFontOfSize(8.0)
cell.textLabel?.text = "\(currentStat.statEvents[indexPath.row].name) \(currentStat.statEvents[indexPath.row].dateRanges) horas=\(currentStat.statEvents[indexPath.row].hours)"
if currentStat.statEvents[indexPath.row].isSelected{
cell.accessoryType = .Checkmark
} else {
cell.accessoryType = .None
}
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: false)
currentStat.statEvents[indexPath.row].isSelected = !currentStat.statEvents[indexPath.row].isSelected
if (contains(selectedMarks, currentStat.statEvents[indexPath.row])) {
//To-Do: remove the object in selectedMarks
} else {
selectedMarks.append(currentStat.statEvents[indexPath.row]) //add the object to selectedMarks
}
tableView.reloadData()
}
问题出在" didSelectRowAtIndexPath"方法。当我选择任何行时,它会将对象附加到" selectedMarks" array(这个工作正常),但问题是当我取消选择其中一些行时,它应该擦除selectedMarks数组中的对象。我试图使用"包含"方法,但我在该行中得到了编译错误
找不到接受提供的参数
的contains的重载
我通过在Stat类中添加Equatable协议来更新我的问题,但我又得到了同样的错误:
找不到接受提供的参数
的contains的重载
并且还出现了新的错误:
命令因信号失败:分段错误:11
答案 0 :(得分:2)
为了使contains
方法在Swift 2中完成工作,您的StatEvents
结构应符合Equatable
协议,如下例所示:
struct StatEvents: Equatable
{
// ...
// implementation of your structure....
// ...
}
// Needed for conforming to the Equatable protocol
func == (lhs: StatEvents, rhs: StatEvents) -> Bool
{
// Return true if the parameters are equal to each other
}
此外,Swift 2中没有全局contains
函数,因此您需要调用新的数组扩展方法contains
,在您的情况下将是这样的:
selectedMarks.contains(currentStat.statEvents[indexPath.row])
还要将协议声明添加到StatEvents
结构,而不是Stat
类。您对==
方法的实现也不正确。它应检查StatEvents
类型的两个对象之间的相等性,如上所示。