2015-06-27 35 views
0

我到目前爲止有一個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數組中的對象。我試圖使用「包含」的方法,但我在這行

could not find an overload for contains that accepts the supplied arguments

我通過在統計類添加Equatable協議更新我的問題得到一個編譯錯誤,但我再次得到了同樣的錯誤:

could not find an overload for contains that accepts the supplied arguments

,也得到一個新的錯誤:

Command failed due to signal: Segmentation fault: 11

+0

快速提示:你的'StatEvents'存儲在一個數組中很重要嗎?另一個有趣的解決方案可能是使用Set(除了'StatEvent'類型採用'Equatable'還需要它採用'Hashable') - 然後在'tableView(_:didSelectRowAtIndexPath:)'您可以使用Set實例方法'exclusiveOr(_ :)'或'exclusiveOrInPlace(_ :)' - 而不是檢查數組是否已經包含成員並決定是否添加或刪除,當然這可能會影響整個代碼,但只是一個想法! – fqdn

回答

2

爲了使contains方法做它在斯威夫特2的工作,你StatEvents結構應該confo RM到協議,如下面的例子:

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 
} 

此外,還有斯威夫特2沒有全局contains功能,所以你需要調用新的陣列擴展方法contains代替,而你的情況會是這樣此:

selectedMarks.contains(currentStat.statEvents[indexPath.row]) 

另外的協議聲明添加到StatEvents結構,而不是到Stat類。您的==方法的實施也不正確。它應該檢查StatEvents類型的兩個對象之間的相等性,如上所示。

+0

我編輯了我的問題,你可以檢查一下嗎?我不知道我在做什麼錯... – Ruben

+0

謝謝!你解決了我的問題! – Ruben

相關問題