我有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
}
}
抱歉,我之前忘了这个方法。
答案 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
}
}