2017-08-25 5 views
0

で、私は非常に多く、ここで発見されたもののようにチュートリアルの変更(簡体字)版、次のいないとき:tableView.insertRowsはNSExceptionをスローしますが、 `insertRows`は` [[0,0]] `

https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/ImplementNavigation.html#//apple_ref/doc/uid/TP40015214-CH16-SW1

、ここでは私のUITableViewControllerです:

import UIKit 

class NewsTableViewController: UITableViewController { 

    @IBOutlet var newsTableView: UITableView! 

    /* 
     MARK: properties 
    */ 
    var news = NewsData() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     dummyNewData() 
    } 

    // MARK: - Table view data source 
    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return news.length() 
    } 


    // here we communicate with parts of the app that owns the data 
    override func tableView(_ tableView: UITableView 
          , cellForRowAt indexPath: IndexPath 
          ) -> UITableViewCell { 

     // note here we're using the native cell class 
     let cell = tableView.dequeueReusableCell(withIdentifier: "newsCell", for: indexPath) 
     // Configure the cell... 
     let row : Int = indexPath.row 
     cell.textLabel?.text = news.read(idx: row) 
     return cell 
    } 


    // MARK: Navigation **************************************************************** 

    // accept message from CreateNewViewController 
    @IBAction func unwindToCreateNewView(sender: UIStoryboardSegue){ 

     if let srcViewController = sender.source as? CreateNewsViewController 
     , let msg = srcViewController.message { 

      // push into news instance and display on table 
      news.write(msg: msg) 
      let idxPath = IndexPath(row: news.length(), section: 1) 

      // tableView.insertRows(at: [idxPath], with: .automatic) 
      tableView.insertRows(at: [[0,0]], with: .automatic) 

      print("unwound with message: ", msg, idxPath) 
      print("news now has n pieces of news: ", news.length()) 
      print("the last news is: ", news.peek()) 

     } 

    } 


    /* 
     @DEBUG: debugging functions that display things on screen ************************** 
    */ 
    // push some values into new data 
    private func dummyNewData(){ 

     print("dummyNewData") 
     news.write(msg: "hello world first message") 
     news.write(msg: "hello world second message") 
     news.write(msg: "hello world third message") 
    } 

} 

問題は、関数unwindToCreateNewViewである:

let idxPath = IndexPath(row: news.length(), section: 1) 
tableView.insertRows(at: [idxPath], with: .automatic) 

news.length()は私にIntという基本的にはsomeArray.countです。

I insertRows(at: [idxPath] ...)、私はエラーを取得する場合:

libc++abi.dylib: terminating with uncaught exception of type NSException 

しかし、ときに行うには、私はちょうどハードコード:

tableView.insertRows(at: [[0,0]], with: .automatic) 

それだけで正常に動作します。そしてシミュレータでは、新しいメッセージが前のメッセージの下に挿入されているのがわかります。何がありますか?

+1

例外テキストを含めるには質問を編集する必要があります。何がうまくいかなかったかを教えてくれますが、最初のコードではセクション1に挿入されますが、2番目のコードではセクション0に挿入されます。テーブルにはセクションが1つしかないので、 – Paulw11

+0

セクション数を1にハードコードしました。セクション番号が0から始まるので、セクション1に行を挿入しようとすると例外が発生します。 – pbasdf

答えて

2

次のコードに問題がある「オフ1で」います

news.write(msg: msg) 
let idxPath = IndexPath(row: news.length(), section: 1) 

のは、このコードが呼び出される直前に、あなたはnewsに商品はありませんことを言ってみましょう。つまり、0行あります。あなたは、新しい行を追加したいときは、行番号がnews.write(msg: msg)は、新しい項目を追加呼び出す0

で開始し、その長さは今IndexPath(row: news.length(), section: 1)セットの行への呼び出し1.

あるので、0行に挿入する必要があります1の値は、それが0

一つの簡単な解決策であることが必要で、これら2つの行を交換することである:適切な行番号をインデックスパスを作成する

let idxPath = IndexPath(row: news.length(), section: 1) 
news.write(msg: msg) 

これは最初のセクションであるため、上記の変更に加えてセクション番号を0に変更する必要があります。

let idxPath = IndexPath(row: news.length(), section: 0) 
news.write(msg: msg) 
関連する問題