Xcode中的索引超出范围错误

时间:2018-03-29 16:45:25

标签: swift firebase firebase-realtime-database tableview

我正在创建一个使用数据库的应用程序,并使用标签来显示信息。我首先创建了一个具有日期信息的标签,当我运行应用程序时,它正常工作。当我为客队信息添加第二个标签时,我运行它并得到一个错误,上面写着:“线程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>

3 个答案:

答案 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)

您的awayTeamDate数组具有不同的项目数 - 确保具有相同的数量以防止此崩溃 - 更好的是,创建一个包含它们的对象。

另外,不要将变量命名为Date,因为它会与Date类冲突。

答案 2 :(得分:1)

首先,不要将Date用作变量名。 Date是Swift结构的保留字。无论如何,Swift变量名都应以小写字母开头。

发生错误是因为observe方法异步工作,并且您在数据源中使用了两个不同的数组。

当您在第一个reloadData完成区observe中调用awayTeam时,它仍然为空,访问项目0会导致崩溃。

解决方案是仅在第二个ovserver中调用reloadData()或者 - 更可靠 - 使用DispatchGroup在所有数据库操作完成时通知。除此之外,强烈建议使用自定义结构作为数据源而不是多个数组。