2016-09-22 6 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の方法を見ようとしましたが、何の問題も見つかりませんでした。私はあなたの間違いが

var count = sections.count // wrong 

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

あるので、それは15行を返しますが、それはとても12行を返さなければなりませんだと思う

答えて

0

これは間違いです。

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

明らかに最初のセクションを削除した場合、セクション0でindexPathを再ロードする必要があります。これはクラッシュを解決する!

0

が、それは、これが役立ちます 希望権利である12を返します

var count = 0 then calculate all section count 

を試してみてください

+0

ありがとう、しかしそれは間違いではありません:これらの "セクション"はtableViewセクションではなく、他のセルに接触している3つのセルだけが崩壊または拡大します。 –

関連する問題