我正在创建一个使用数据库的应用程序,并使用标签来显示信息。我首先创建了一个具有日期信息的标签,当我运行应用程序时,它正常工作。当我为客队信息添加第二个标签时,我运行它并得到一个错误,上面写着:“线程1致命错误:索引超出范围”。这会与数据库或表视图本身有关吗?
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Tea Cozy | Home</title>
<link rel="stylesheet" href="./resources/css/style.css">
</head>
<body>
<header>
<img src="./resources/images/img-tea-cozy-logo.png" alt="our logo">
<nav>
<a href="#"><span>Mission</span></a>
<a href="#"><span>Featured Tea</span></a>
<a href="#"><span>Locations</span></a>
</nav>
</header>
<!-- main-content -->
<div class="mission">
<div style="position:relative">
<img src="http://via.placeholder.com/850x350" />
<div class="mission-banner">
<h2>Our Mission</h2>
<h4>Handpicked, Artisanally Curated, Free Range, Sustainable, Small Batch, Fair Trade, Organic Tea</h4>
</div>
</div>
</div>
</body>
</html>
答案 0 :(得分:1)
首先,您不要以大写字母开头命名变量。 第二,因为您在表视图中使用两个不同的数组来加载数据,所以awayTeam会使您的应用程序崩溃,因为它没有Date数组那样多的元素,因为您使用Date.count来实现部分中的行数。
更改
databaseHandle = ref.child("Dates").observe(.childAdded) { (snapshot) in
let post = snapshot.value as? String
if let actualPost = post {
self.Date.append(actualPost)
self.footballTableView.reloadData()
}
}
到
databaseHandle = ref.child("Dates").observe(.childAdded) { (snapshot) in
let post = snapshot.value as? String
if let actualPost = post {
self.Date.append(actualPost)
}
}
因此,在加载远程数据之前,您不会重新加载表视图数据。
答案 1 :(得分:1)
您的awayTeam
和Date
数组具有不同的项目数 - 确保具有相同的数量以防止此崩溃 - 更好的是,创建一个包含它们的对象。
另外,不要将变量命名为Date
,因为它会与Date类冲突。
答案 2 :(得分:1)
首先,不要将Date
用作变量名。 Date
是Swift结构的保留字。无论如何,Swift变量名都应以小写字母开头。
发生错误是因为observe
方法异步工作,并且您在数据源中使用了两个不同的数组。
当您在第一个reloadData
完成区observe
中调用awayTeam
时,它仍然为空,访问项目0会导致崩溃。
解决方案是仅在第二个ovserver中调用reloadData()
或者 - 更可靠 - 使用DispatchGroup
在所有数据库操作完成时通知。除此之外,强烈建议使用自定义结构作为数据源而不是多个数组。