我正在制作一个应用程序,其中我需要在其中一个屏幕中显示此内容。
我已经将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部分的数据。
非常感谢任何帮助。
答案 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()
}