私はスウィフト3とFirebaseにおける基本的な経験を持っていると私はここに地元の学校の教師です私の町で友人のグループのためのアプリを構築しています。彼らは、接続されている方法で、学生のチェックリスト検証のためのアプリを求めています。致命的なエラー:範囲外のインデックス - スウィフト3とFirebase
私は3つのビューコントローラとタブバーコントローラを持つテーブルビューで最初のビューコントローラとアプリを持っており、追加の学生をクリックします。エラーの原因となる最初の1つでは、1)学生(pckStudents)と2)教師(pckTeachers)の2つのピッカービューがあります。彼らはFirebaseの同じメインルートの異なるノード(子)から来ます。
var teachers: [teachers] = []
var students: [students] = []
は、私は2つの異なるアレイ、生徒用と教師のための1つを作成する必要があります、私は配列の宣言を持っているこれら二つのピッカービューこの最初のビューコントローラ、で
Main root –
-- Validation2017
-- teachers
-- key
-- teacherName
-- students
-- key
-- studentName
-- validation
-- key
-- name
-- final note
-- dateTime
---- Level 1 (...)
。第一に、それらは異なる種類のデータであるため、それらの間には関係がありません。 2つ目の理由は、私が試した他のすべての方法では、両方の項目について1つの観察だけでデータをロードしようとする問題を解決できないためです。各子供のための1つのスナップショット。この方法をやって
、[OK]ビューコントローラの負荷が、私はピッカービューの1つを選択する]をクリックしたときには常に、私はメッセージが表示されます。範囲外のインデックス:致命的なエラーが。ときには、クリックしてピッカービュー1でこのエラーが発生することがあります。時には2となります。なぜこれも理由はありません。
は、私はここや他のサイトで見つかったすべての説明と解決策を試してみましたが、私はそれを修正しない、どちらも特にスウィフト3とXcode 8のためのいくつかを見つけることができませんでしたし、私は誰かが私を助けることができる願っています。私の英語で申し訳ありません(私は最善を尽くそうとしています)、間違った方法で用語や機能、コードアクションを書いてしまった場合ご清聴ありがとうございました。
両方の配列のための私のサブクラス:(各配列をロードするための - - CarregarT()とCarregarS()(教師だけのために...学生を切り替える...)
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
]
}
その後は、私は2つのメソッドを作成しましたviewDidLoadで場所):(スイッチは "学生" とCarregarAのための "studentName" のためにと "teacherNameを" "教えて"())
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に署名しましたタグ= 2)
としてタグ= 1及びPCVfunc 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
}
ありがとうございました。
更新日:
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
}
}
申し訳ありませんが、私は前にこの方法を忘れてしまったdidSelectRow方法。
エラーを生成する行が混乱しています。あなたはそれを指摘しますか?それはここから来ている '教師[行]'? – Honey
numberOfComponentsInPickerViewを追加し、1つのコンポーネントがあると仮定して1を返しますか?また、これは技術的な問題ではありませんが、あなたの学生と教師の構造体はteacherArrayと呼ばれています。明快にするためにstudentStructとteacherStructを呼び出すことをお勧めします。 – Jay
申し訳ありません、ごめんなさい@ハニー。私はdidSelectRowを忘れてしまった。メソッドのエラーメッセージが表示されます。申し訳ありませんが、上記のコードを更新しました。 –