致命错误:索引超出范围 - Swift 3和Firebase

时间:2016-12-21 19:49:49

标签: ios firebase swift3 firebase-realtime-database uipickerview

我有Swift 3和Firebase的基本经验,我正在为我所在城市的一群朋友建立一个应用程序。他们想要一个应用程序,以他们所连接的方式验证学生的清单。

我有一个应用程序,第一个视图控制器有一个表视图,然后单击添加学生我有一个标签栏控制器和另外三个视图控制器。在第一个错误来自的地方,我有2个选择器视图:1)学生(pckStudents)和2)教师(pckTeachers)。它们来自Firebase的同一主根的不同点头(孩子)。

Main root –
    -- Validation2017
          -- teachers
              -- key
              -- teacherName
          -- students
              -- key
              -- studentName
          -- validation
              -- key
              -- name
              -- final note
              -- dateTime
              ---- Level 1 (...)

在第一个视图控制器中,这两个选择器视图是,我有数组的声明:

var teachers: [teachers] = []
var students: [students] = []

我必须创建两个不同的数组,一个用于学生,一个用于教师。首先,因为它们是不同类型的数据,它们之间没有关系;第二,因为我尝试过的所有其他方法都无法解决试图加载数据的问题,只需对两个项目进行一次观察;每个孩子都有一个快照。

这样,视图控制器加载正常,但是当我单击以选择其中一个选择器视图时,我收到消息:致命错误:索引超出范围。有时当我点击并且选择器视图1出现此错误时,有时候会出现2号。我也不知道为什么这样。

我已经尝试了我在这里和其他网站上找到的所有描述和解决方案,但我无法修复它,也没有找到专门针对Swift 3和Xcode 8的内容,我希望有人可以帮助我。对不起我的英语(我正努力做到最好),如果我以错误的方式编写了一些术语或功能或一些代码操作。感谢您的关注。

我的两个数组的子类:(只切换学生......老师......)

struct students {

var studentName: String?
var key: String!

init(studentName: String, key: String = "") {
    self.studentName = studentName
    self.key = key
}

init(snapshot: FIRDataSnapshot) {
    key = snapshot.key
    let snapshotValue = snapshot.value as! [String: AnyObject]
    studentName = snapshotValue["studentName"] as? String
}

func toAnyObject() -> Any {
    return [
        "studentName": studentName,
        "userKey": key
    ]
}

然后,我创建了两个方法 - CarregarT()和CarregarS() - 用于加载每个数组(放在viewDidLoad处):(切换"教导"和" teacherName"用于&# 34;学生"和#34; studentName"为CarregarA())

func CarregarT() {
    let refW = FIRDatabase.database().reference().child("Validation2017").child("teachers")
    refW.queryOrdered(byChild: "teacherName").observe(.value, with: {(snapshot) in

        var newTeste2: [teachers] = []
        for resposta in snapshot.children {
            let itemsAadicionar = teachers(snapshot: resposta as! FIRDataSnapshot)
            newTeste2.append(itemsAadicionar)
        }
        self.refw2 = newTeste2
        self.pckTeachers.reloadAllComponents()
      })
}

最后,针对1和2的UIPickerView方法(我将pickerview 1签名为tag = 1,将pcv2签名为tag = 2)

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerView.tag == 1 {
        return teachers.count
     }else{
        return students.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView.tag == 1 {
    return teachers[row].teacherName
}else{
return students[row].studentName
     }

谢谢。

更新:方法didSelectRow

var PreceptorG: String!
var NomeG: String!

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        let studentCh = students[row].studentName
        let teacherCh = teachers[row].teacherName

            if pickerView.tag == 1{
              PreceptorG = teacherCh

            }else{
                NomeG = studentCh
              }
        }

抱歉,我之前忘了这个方法。

1 个答案:

答案 0 :(得分:0)

在didSelecRow中,我将行let studentCh = students[row].studentName移动到其pickerview.tag引用中,并将其移动到另一行。这是didSelectRow的最终代码。现在不再崩溃了:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

            if pickerView.tag == 1{
            let teacherCh = teachers[row].teacherName
            PreceptorG = teacherCh

            }else{
            let studentCh = students[row].studentName
            NomeG = studentCh

  }
        }