【发布时间】:2015-06-27 22:31:16
【问题描述】:
到目前为止,我有一个可以处理多个选择行的 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”数组中(这工作正常),但问题是当我取消选择其中一些行时,它应该删除 selectedMarks 数组中的对象。我正在尝试使用“包含”方法,但在该行中出现编译错误
找不到接受所提供参数的包含的重载
我通过在 Stat 类中添加 Equatable 协议来更新我的问题,但我再次遇到相同的错误:
找不到接受所提供参数的包含的重载
并且还得到一个新的错误:
由于信号而导致命令失败:分段错误:11
【问题讨论】:
-
附注:将
StatEvents存储在数组中是否重要?另一个有趣的解决方案可能是改用 Set (除了您的StatEvent类型采用Equatable还要求它采用Hashable) - 然后在tableView(_:didSelectRowAtIndexPath:)的主体中而不是检查 Array已经包含该成员并决定是否添加或删除,您可以使用 Set 实例方法exclusiveOr(_:)或exclusiveOrInPlace(_:)- 当然可能会在您的代码中的其他地方产生影响,但只是一个想法!
标签: ios objective-c swift uitableview swift2