【问题标题】:Get multiple selected rows info of an uitableview获取uitableview的多个选定行信息
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我编辑了我的问题,你能检查一下吗?我不知道我做错了什么......
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 2019-08-07
  • 1970-01-01
  • 2015-12-29
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多