gpt4 book ai didi

ios - tableView.insertRows 抛出 NSException,但不是当 `insertRows` at `[[0,0]]`

转载 作者:搜寻专家 更新时间:2023-11-01 07:09:09 24 4
gpt4 key购买 nike

我正在遵循本教程的修改(简化)版本,非常类似于此处的内容:

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)

它工作得很好。在模拟器上,我看到新消息插入到之前的消息下方。给了什么?

最佳答案

以下代码存在“差一”问题:

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)

关于ios - tableView.insertRows 抛出 NSException,但不是当 `insertRows` at `[[0,0]]`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45890210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com