gpt4 book ai didi

ios - 将数据加载到 TableView 的正确方法

转载 作者:行者123 更新时间:2023-11-28 12:46:24 25 4
gpt4 key购买 nike

我有一个应用程序可以从 JSON 数据加载问题列表并将它们显示在 TableView 上。

大部分时间一切正常,但似乎我做错了什么,这就是为什么 - 应用程序崩溃了。

这种情况很少发生,所以很难检测到,但我敢肯定逻辑上一定有问题。

所以我有问题的模型类和问题项的数组:

class questionItem {
var id = 0
var title : String = ""
var question : String = ""
}

var questions = [questionItem]()

在我的 ViewController 中,我有用于 TableView 的 IBOutlet,我将数据加载放在 viewDidLoad 中

class QuestionsListVC: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var questionsTableView: UITableView!

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

func get_questions()
{
let request = NSMutableURLRequest(URL:myURL!)
request.HTTPMethod = "POST"
let postString = ""

request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

let task = NSURLSession.sharedSession().dataTaskWithRequest(request)
{
data, response, error in

if error != nil {
print("error=\(error)")
return
}

//clearing array for new items
questions.removeAll(keepCapacity: false)

dispatch_async(dispatch_get_main_queue(),{

var json = JSON(data: data!)

if let items = json["questions"].array {
for item in items {
let question = questionItem()
question.id = item["id"].int!
question.title = item["title"].string!;
question.question = item["question"].string!
questions.append(question)
}
}

self.questionsTableView.reloadData()
});
}
task.resume()
}
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return questions.count
}

错误显示在 cellForRowAtIndexPath 中

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell : QuestionsListCell = self.questionsTableView.dequeueReusableCellWithIdentifier("QuestionsListCell") as! QuestionsListCell

//error happens here - Index out of range
print(questions[indexPath.row].title)

它在 6 个案例中发生一次,并且在 6 个测试中的其他 5 个中没有错误 - 但我不明白为什么。

最佳答案

这表明

有问题
numberOfSectionsInTableView

和/或

numberOfRowsInSection

你能发布你目前对这些的实现吗?

如果您只显示一个连续的列表,numberOfSectionsInTableView 应始终返回 1,并且您需要检查 numberOfRowsInSection 是否准确返回数据源中的项目数。

编辑:

您能否尝试在使用新项目更新之前立即清除主线程上的现有数据源,如下面的代码所示:

        dispatch_async(dispatch_get_main_queue(),{

questions.removeAll(keepCapacity: false)

var json = JSON(data: data!)

if let items = json["questions"].array {
for item in items {
let question = questionItem()
question.id = item["id"].int!
question.title = item["title"].string!;
question.question = item["question"].string!
questions.append(question)
}
}

self.questionsTableView.reloadData()
});

关于ios - 将数据加载到 TableView 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37964248/

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