2016-09-22 91 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个细胞接触他们的其他细胞折叠或展开。 –

相关问题