2016-09-22 68 views
0

我實現了一個tableView使行摺疊和展開;這是我的課(我跟着this教程):NSInternalInconsistencyException更新Tableview

import UIKit 
import ChameleonFramework 

class AllTeamChantsController: UIViewController, UITableViewDataSource, UITableViewDelegate 
{ 
    var ponte: String? 
    var sections: [Section]! 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     if let stringaPonte = ponte 
     { 
      title = stringaPonte 
     } 

     sections = [Section(name: "Derby", items: ["coro", "coro", "coro", "coro"]), 
        Section(name: "Personagi", items: ["coro", "coro", "coro", "coro"]), 
        Section(name: "Cori", items: ["coro", "coro", "coro", "coro"])] 
    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
    } 

    func numberOfSections(in tableView: UITableView) -> Int 
    { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     var count = sections.count 

     for section in sections 
     { 
      count += section.items.count 
     } 

     return count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     let section = getSectionIndex(indexPath.row) 
     let row = getRowIndex(indexPath.row) 

     if row == 0 
     { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "header") as! AllTeamChantsHeader 
      cell.titleLabel.text = sections[section].name 
      cell.toogleButton.tag = section 
      cell.toogleButton.setTitle(sections[section].collapsed! ? "+" : "-", for: UIControlState()) 
      cell.toogleButton.addTarget(self, action: #selector(AllTeamChantsController.toggleCollapse), for: .touchUpInside) 

      return cell 
     } 
     else 
     { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as UITableViewCell! 
      cell?.textLabel?.text = sections[section].items[row - 1] 

      return cell! 
     } 
    } 


    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    { 
     let section = getSectionIndex((indexPath as NSIndexPath).row) 
     let row = getRowIndex((indexPath as NSIndexPath).row) 

     if row == 0 
     { 
      return 50.0 
     } 

     return sections[section].collapsed! ? 0 : 44.0 
    } 

    // MARK: - Event Handlers 

    func toggleCollapse(_ sender: UIButton) { 
     let section = sender.tag 
     let collapsed = sections[section].collapsed 

     // Toggle collapse 
     sections[section].collapsed = collapsed! 

     let indices = getHeaderIndices() 

     let start = indices[section] 
     let end = start + sections[section].items.count 

     tableView.beginUpdates() 
     for i in start ..< end + 1 { 
      tableView.reloadRows(at: [IndexPath(row: i, section: 1)], with: .automatic) 
     } 
     tableView.endUpdates() 
    } 

    // MARK: - Helper Functions 

    func getSectionIndex(_ row: NSInteger) -> Int { 
     let indices = getHeaderIndices() 

     for i in 0..<indices.count { 
      if i == indices.count - 1 || row < indices[i + 1] { 
       return i 
      } 
     } 

     return -1 
    } 

    func getRowIndex(_ row: NSInteger) -> Int { 
     var index = row 
     let indices = getHeaderIndices() 

     for i in 0..<indices.count { 
      if i == indices.count - 1 || row < indices[i + 1] { 
       index -= indices[i] 
       break 
      } 
     } 

     return index 
    } 

    func getHeaderIndices() -> [Int] { 
     var index = 0 
     var indices: [Int] = [] 

     for section in sections { 
      indices.append(index) 
      index += section.items.count + 1 
     } 

     return indices 
    } 
} 

的問題是,當我輕觸切換按鈕,我的應用程序崩潰和Xcode中給我這個消息在控制檯

「終止應用程序由於未捕獲異常'NSInternalInconsistencyException',原因:'試圖從第1部分刪除行X,但更新前只有1個部分「。

誰能幫我解決這個問題呢?我只是試圖環顧numberOfRowsInSectiontoggleCollapse方法,但我沒有發現任何問題。

回答

0

這是錯誤:

for i in start ..< end + 1 { 
      tableView.reloadRows(at: [IndexPath(row: i, section: 1)], with: .automatic) 
     } 

顯然,如果我刪除第一部分我必須重新加載索引0節0不!這解決了崩潰!

0

,我認爲你的錯誤是

var count = sections.count // wrong 

    for section in sections 
    { 
     count += section.items.count 
    } 

所以它會返回15行,但它必須返回12行,以便儘量

var count = 0 then calculate all section count 

它將返回12,是適合 希望這將有助於

+0

感謝傢伙,但它不是錯誤:這些「節」都沒有的tableView節,但只有3個細胞接觸他們的其他細胞摺疊或展開。 –