2015-05-28 61 views
16

從plist文件加載tableview。這工作沒有問題。我只是想「勾選」標籤行。目前與我的代碼,它不會按需要工作。目前,它洛斯這樣的:在tableview中選擇多行,並勾選選中的行

  • 自來水ROW1(它會打勾行1 =好)
  • 自來水ROW1再次(沒有任何反應=糟糕,我希望這裏的排鬚取消選中。) 雖然再次攻在第1行,它unt然後。在secont之後點擊它。
  • 當我在的tableview的初始載分接開關ROW0它從來沒有蜱我行

我的代碼:

class portals: UITableViewController { 

    var lastSelectedIndexPath = NSIndexPath(forRow: -1, inSection: 0) 

... 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! UITableViewCell 

     // Configure the cell... 
     cell.textLabel!.text = portals[indexPath.row] 

     return cell 
    } 


    // Check which portal is selected 
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     var whichPortalIsSelected: String = "" 

     // Get Cell Label 
     let indexPath = tableView.indexPathForSelectedRow(); 

     // Tick the selected row 
     if indexPath!.row != lastSelectedIndexPath?.row { 

      let newCell = tableView.cellForRowAtIndexPath(indexPath!) 
      newCell?.accessoryType = .Checkmark 

      lastSelectedIndexPath = indexPath 

      whichPortalIsSelected = newCell!.textLabel!.text! 
      println("You selected cell #\(lastSelectedIndexPath.row)!") //PPP 
      println("You selected portal #\(whichPortalIsSelected)!") //PPP 

     // Un-Tick unselected row 
     } else { 
      let newCell = tableView.cellForRowAtIndexPath(indexPath!) 
      newCell?.accessoryType = .None 

      whichPortalIsSelected = newCell!.textLabel!.text! 
      println("You unselected cell #\(indexPath!.row)!") //PPP 
      println("You unselected portal #\(whichPortalIsSelected)!") //PPP 
     } 

    } 
} 

回答

2

有這個問題的許多解決方案,這裏有一個我想出了。我正在使用內置的單元格「selected」屬性,以便tableview爲我們保存它。只要確保在你的故事板或當你在代碼中設置tableview使用多個選擇。

import UIKit 

class TableViewController: UITableViewController 
{ 
    var lastSelectedIndexPath = NSIndexPath(forRow: -1, inSection: 0) 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! UITableViewCell 

     // Configure the cell... 
     cell.textLabel!.text = "row: \(indexPath.row)" 

     if cell.selected 
     { 
      cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
     } 
     else 
     { 
      cell.accessoryType = UITableViewCellAccessoryType.None 
     } 

     return cell 
    } 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     let cell = tableView.cellForRowAtIndexPath(indexPath) 

     if cell!.selected == true 
     { 
      cell!.accessoryType = UITableViewCellAccessoryType.Checkmark 
     } 
     else 
     { 
      cell!.accessoryType = UITableViewCellAccessoryType.None 
     } 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return 100 
    } 
} 

我在這裏做了一個樣本項目:https://github.com/brcimo/SwiftTableViewMultipleSelection

+0

這似乎並不奏效。 'tableView:didSelectRowAtIndexPath:'只有在選中該行時纔會調用,而不是在取消選擇時調用,因此'cell.selected'將始終爲真! – entropid

6

這使勾去掉。

class TableViewController: UITableViewController 
{ 
    var lastSelectedIndexPath = NSIndexPath(forRow: -1, inSection: 0) 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) 

     // Configure the cell... 
     cell.textLabel!.text = "row: \(indexPath.row)" 

     if cell.selected 
     { 
      cell.selected = false 
      if cell.accessoryType == UITableViewCellAccessoryType.None 
      { 
       cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
      } 
      else 
      { 
       cell.accessoryType = UITableViewCellAccessoryType.None 
      } 
     } 

     return cell 
    } 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     let cell = tableView.cellForRowAtIndexPath(indexPath) 

     if cell!.selected 
     { 
      cell!.selected = false 
      if cell!.accessoryType == UITableViewCellAccessoryType.None 
      { 
       cell!.accessoryType = UITableViewCellAccessoryType.Checkmark 
      } 
      else 
      { 
       cell!.accessoryType = UITableViewCellAccessoryType.None 
      } 
     } 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return 100 
    } 
} 
+0

這是完美的。謝謝。 –

57

斯威夫特4

簡單地繼承UITableViewCell的是這樣的:

class CheckableTableViewCell: UITableViewCell { 
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
     self.selectionStyle = .none 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
     self.accessoryType = selected ? .checkmark : .none 
    } 
} 

然後用它在你的cellForRowAt indexPath這樣:

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", 
    for: indexPath) as? CheckableTableViewCell 

如果有必要,不要別忘了繼承原型細胞在廈門國際銀行/分鏡:

enter image description here

+0

這種方式非常有用,請告訴我如何獲得表格視圖中所選單元格的索引或更好地引導我,如果我有關於單元格的更多信息的數組我怎樣才能獲得所選單元格的信息數組並非全部其中 –

+0

不幸的是,當滾動tableView時,使用可重用的表格視圖單元格時,所選單元格的'isSelected'屬性似乎會丟失。因此,您可以選擇多個單元格,獲得選中標記,在tableView中向下滾動,再次向上滾動,單元格將再次取消選中。有任何想法嗎? – Alienbash

+0

你是對的@Alienbash,我相應地修改了我的答案。 –

1

你必須做出一個服裝類來獲取細胞,你必須覆蓋一個FUNC叫 的setSelected的選中狀態(_選擇:BOOL,動畫:布爾) 或勾選將隨着您滾動隨機顯示... 這裏是我做的一個例子: 1-爲細胞創建了一個類 2-爲圖像添加了一個插口來顯示滴答聲(如果你不想要一個滴答滴答的圖像,你可以逃脫這個) 3 - overrided的功能和使用選擇帕拉姆:d

這裏是我的類:

進口的UIKit

類AddLocationCell:{UITableViewCell的

@IBOutlet weak var check: UIImageView! 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
    if selected{ 
     check.image = UIImage(named:"check_active") 
    }else{ 
     check.image = UIImage(named:"check_normal") 

    } 
    // Configure the view for the selected state 
} 

}

4

首先,去你的故事板,並選擇你的tableview,並在屬性檢查器,設置選擇多重選擇

Attributes Inspector with multiple selection

然後,重寫的setSelected(_選自:布爾,動畫:BOOL)中的UITableViewCell的亞類的功能。

override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
     accessoryType = selected ? UITableViewCellAccessoryType.checkmark : UITableViewCellAccessoryType.none 
    }