2017-08-25 24 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

當我insertRows(at: [idxPath] ...),我得到錯誤:

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

但當我只是硬編碼做到:

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

它工作得很好。在模擬器上,我看到新消息插入到以前的消息下面。是什麼賦予了?

+1

您需要編輯您的問題,包括異常文本;它會告訴你出了什麼問題,但是在你插入第一部分的第一個代碼中,但是在第二個代碼中插入到第0部分。你的表只有一個部分,所以插入到第二部分(第1部分)中't work – Paulw11

+0

您已將段數硬編碼爲1.由於段號從0開始,因此在段1中插入行的任何嘗試都將觸發異常。 – pbasdf

回答

2

你有一個「關閉的一個」問題下面的代碼:

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

比方說,這段代碼調用前,你有沒有news項目。這意味着有0行。當你想添加一個新行,你必須在0行插入,因爲行號從0

開始調用news.write(msg: msg)添加新項目,現在它的長度爲1

調用IndexPath(row: news.length(), section: 1)套行爲1的值,但需要爲0

一種簡單的解決方案是交換這兩條線:

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) 
相關問題