在tableview部分中未正确填充数据

时间:2017-11-21 18:51:08

标签: ios swift uitableview

我正在制作一个应用程序,其中我需要在其中一个屏幕中显示此内容。 enter image description here

我已经将tableview用于以下代码中显示的部分

    var sections = ["Adventure type"]
    var categoriesList = [String]()
    var items: [[String]] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        categoryTableView.delegate = self
        categoryTableView.dataSource = self

        Client.DataService?.getCategories(success: getCategorySuccess(list: ), error: getCategoryError(error: ))
    }

    func getCategorySuccess(list: [String])
    {
        categoriesList = list
        let count = list.count

        var prevInitial: Character? = nil
        for categoryName in list {

            let initial = categoryName.first
            if initial != prevInitial {  // We're starting a new letter
                items.append([])
                prevInitial = initial
            }
            items[items.endIndex - 1].append(categoryName)
        }

        for i in 0 ..< count
        {
            var tempItem = items[i]
            let tempSubItem = tempItem[0]
            let char = "\(tempSubItem.first)"
            sections.append(char)
        }
    }

    func getCategoryError(error: CError)
    {
        print(error.message) 
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

        return self.sections[section]

    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {

        return self.sections.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items[section].count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = categoryTableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)
        cell.textLabel?.text = self.items[indexPath.section][indexPath.row]
        return cell
    }

但它在return self.items[section].count上产生运行时错误 出现此错误的原因是因为我正在从服务器加载数据(items数组),然后在其后填充sections数组。生成tableview时,sections和items数组都为空。这就是错误发生的原因。 我是iOS新手,并没有掌握如何调整tableview部分的数据。

  • 有人可以建议我更好的方法吗?
  • 当我不知道服务器调用的项目将返回多少时,部分中的行数应该是多少?
  • 此外,我想介绍服务器调用失败并且未返回任何数据的情况。隐藏tableview(并显示错误消息)是否足够?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

看看是否有效:使您的数据源成为可选:

var items: [[String]]?

getCategorySuccess中实例化并填充值。然后致电categoryTableView.reloadData()重新加载您的表格视图。

您可以为行添加空检查,如下所示:

return self.items?[section].count ?? 0

默认返回0。部分数量也是如此:

return self.items?.count ?? 0

如果呼叫失败,我会使用UIAlertController显示错误消息。

答案 1 :(得分:0)

您的评论不正确:&#34;生成tableview时,sections和items数组都为空。这就是错误发生的原因。&#34;

根据您的代码,sections初始化为一个条目:

var sections = ["Adventure type"]

这就是您的应用崩溃的原因。你告诉tableview你有一个部分,但是当它试图找到该部分的项目时,它会因为items为空而崩溃。

尝试将节初始化为空数组:

var sections = [String]()

事情应该会好起来的。你的应用程序不应该崩溃,尽管你的表是空的。

现在,在getCategorySuccess结束时,您需要重新加载表以反映服务检索到的数据。据推测,这是一个异步回调,因此您需要调度到主队列才能执行此操作。这应该有效:

DispatchQueue.main.async {
    self.categoryTableView.reloadData()
}