2016-12-21 7 views
1

Swift 3 및 Firebase에 대한 기본 경험이 있으며, 내 도시에있는 학교의 교사 그룹 인 친구 그룹을위한 응용 프로그램을 만들고 있습니다. 그들은 연결된 방식으로 학생들의 체크리스트 검증을위한 앱을 원합니다.치명적 오류 : 색인이 범위를 벗어남 - Swift 3 및 Firebase

저는 테이블 뷰가있는 첫 번째 뷰 컨트롤러가있는 학생이 있으며 학생 추가를 클릭합니다. 뷰 컨트롤러가 세 개인 탭 막대 컨트롤러가 있습니다. 오류가 발생한 첫 번째 부분에는 1) 학생 (pckStudents)과 2) 교사 (pckTeachers)의 두 가지 선택보기가 있습니다. 그들은 Firebase의 같은 메인 루트에있는 다른 노드 (차일드)에서 왔습니다. 나는 두 개의 서로 다른 배열, 학생들을위한 하나와 교사를위한 하나를 만들 필요가

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

:

이 두 피커보기는 첫 번째 뷰 컨트롤러에서
Main root – 
    -- Validation2017 
      -- teachers 
       -- key 
       -- teacherName 
      -- students 
       -- key 
       -- studentName 
      -- validation 
       -- key 
       -- name 
       -- final note 
       -- dateTime 
       ---- Level 1 (...) 

, 나는 배열의 선언이 . 첫째, 서로 다른 종류의 데이터이기 때문에 관계가 없습니다. 둘째, 내가 시도한 다른 모든 방법으로는 두 항목 모두에 대해 하나만 관찰하여 데이터로드를 시도하는 문제를 해결할 수 없었기 때문에; 각 어린이를위한 하나의 스냅 샷.

이렇게하면 뷰 컨트롤러가로드되지만 항상 선택기보기 중 하나를 클릭하여 선택하면 다음과 같은 메시지가 나타납니다. 치명적인 오류 : 인덱스가 범위를 벗어납니다. 때로는 클릭하여 선택기보기 1에서이 오류가 발생하는 경우가 있는데 때로는 숫자 2가됩니다.이 이유도 아닙니다.

나는 여기와 다른 사이트에서 발견 한 모든 설명과 해결책을 시도했지만, 그것을 고칠 수는 없으며, 스위프트 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에서 장소) : (스위치 CarregarA은 "학생"과 "TEACHERNAME"와 "studentName"을 "가르친다"())

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에 서명을 태그 = 1 및 pcv2 : 태그 = 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 
    } 

고맙습니다.

업데이트 :

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 방법.

+0

어떤 줄이 오류를 생성하는지 혼란 스럽습니다. 그걸 지적 해 주시겠습니까? 여기에서'선생님'이 오는거야? – Honey

+0

하나의 구성 요소가 있다고 가정하고 numberOfComponentsInPickerView를 추가하고 1을 반환 하시겠습니까?또한 기술적 인 문제는 아니지만 학생과 교사 구조체의 이름이 teacherArray 인 경우 학생 구조를 명확하게하기 위해 teacherStruct 및 teacherStruct를 호출 할 수 있습니다. – Jay

+0

죄송합니다, 죄송합니다. @ 얘. didSelectRow를 잊어 버렸습니다. 메소드에 오류 메시지가 표시됩니다. 죄송합니다. 위 코드를 업데이트했습니다. –

답변

0

내부 didSelecRow 나는 그 라인을의 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 

    } 
     } 
관련 문제