获取uitableview的多个选定行信息

时间:2015-06-27 22:31:17

标签: ios objective-c swift uitableview swift2

到目前为止,我有一个使用多个选择行的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

1 个答案:

答案 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类型的两个对象之间的相等性,如上所示。