2015-09-08 2 views
1

Я разрабатываю приложение Quiz, которое выдает вопросы от JSON. Я уже использовал reloadData для TableView много раз & работал, как ожидалось. Но теперь я получаю вопросы, используя Alamofire &, сохраняя его в массиве &, получая вопросы из массива.TableView.reloadData() не работает? (SWIFT)

Но он возвращает Array is Out of Index.

Как я могу отобразить первый элемент массива в первой ячейке?

VC

class ExamController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var Exam: UITableView! 

    var CourseID : String! 
    var EID : String! 
    var EName : String! 
    var ET : String! 

    var QArray : [String] = [] 

    var progress = GradientCircularProgress() 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     progress.show(style:MyStyle()) 
     // JUST TRIED 
     dispatch_async(dispatch_get_main_queue(), { 
      self.getQuestions() 
      // DO SOMETHING ON THE MAINTHREAD 
      self.Exam.reloadData() 
     }) 

     self.Exam.tableFooterView = UIView(frame: CGRectZero) 
     self.Exam.tableFooterView?.hidden = true 
    } 

    func getQuestions(){ 

     if ET == "CHAPTER" { 
      Alamofire.request(.GET, "http://www.wis.com/index.php/capp/chapter_questions_details/\(CourseID)/\(EID)/10") 
       .responseJSON { (_, _, data, _) in 
        println(data) 
        let json = JSON(data!) 
        let catCount = json.count 
        for index in 0...catCount-1 { 
         let q = json[index]["QUESTION"].string 
         self.QArray.append(q!) 
         println(self.QArray) 
        } 

      } 

      self.progress.dismiss() 
      self.Exam.reloadData() 

     } else if ET == "FA" { 
      Alamofire.request(.GET, "http://www.wis.com/index.php/capp/fa_questions_by_course_id/\(CourseID)/\(EID)") 
       .responseJSON { (_, _, data, _) in 
        println(data) 
        let json = JSON(data!) 
        let catCount = json.count 
        for index in 0...catCount-1 { 
         let q = json[index]["QUESTION"].string 
         self.QArray.append(q!) 
         println(self.QArray) 
        } 

      } 
         self.progress.dismiss() 
         self.Exam.reloadData() 
    } 
} 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 5 
    } 


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     if indexPath.row == 0{ 
      let cell = self.Exam.dequeueReusableCellWithIdentifier("Question") as! QuestionCell 

      cell.Questionlabel?.text = QArray[0] 
      return cell 

     } 
     else 
     { 
      let cell = self.Exam.dequeueReusableCellWithIdentifier("Option") as! OptionCell 

      cell.Optionlabel?.text = "Option" 
      return cell 

     } 
    } 
+2

'numberOfRowsInSection' должен вернуть количество элементов в источнике данных динамически не статическое значение – vadian

+0

Помещенный' println' заявление, в тех местах, где вы называете 'reloadData'. Я предполагаю, что вызов перезагрузки происходит до того, как ваши данные будут возвращены. Журнал должен показать вам порядок вызовов. –

+0

@vadian мой массив имеет более 100 вопросов. Но мне нужно всего 5 строк в моем TableView. – user5184878

ответ

0

Вы должны перезагрузить TableView внутри Alamofire блока

И так он будет выглядеть

Alamofire.request(.GET, "http://www.wis.com/index.php/capp/chapter_questions_details/\(CourseID)/\(EID)/10") 
      .responseJSON { (_, _, data, _) in 
       println(data) 
       let json = JSON(data!) 
       let catCount = json.count 
       for index in 0...catCount-1 { 
        let q = json[index]["QUESTION"].string 
        self.QArray.append(q!) 
        println(self.QArray) 
       } 
     self.progress.dismiss() 
     self.Exam.reloadData() 
    } 

да конечно, в соответствии с заданными ответами и комментариями,

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.QArray?.count ?? 0 // will return 0 rows if QArray is empty 
} 

Это может Помогите!

+0

Проблема в том, что мой QArray имеет более 100 элементов. Но я просто хочу, чтобы количество строк было равно 5. Как я могу сделать это – user5184878

+0

какая база данных вы используете? – iRiziya

+0

Я не использую ни одну базу данных – user5184878

0

Похоже, вам нужно поставить перезарядку в обработчик завершения, так что у вас есть данные, когда вы пытаетесь обновить пользовательский интерфейс.

Чтобы быть в безопасности (в случае других вызовов для перезагрузки), вы также можете защитить свое возвращаемое значение в numberOfRowsInSection, проверив, есть ли как минимум 5 элементов в QArray.

2

Используйте диспетчерскую очередь для вызова обработчика завершения в .responseJSON, и оттуда обновите свой интерфейс.

E.G.

Alamofire.request(.GET, postEndpoint, headers: headers) 
     .responseJSON { response in 

    // Do something... 

    dispatch_async(dispatch_get_main_queue(), { 
     // Update your UI here 
     self.tableView.reloadData() 
    }) 
} 
+0

Спасибо, это полезно !! – AmyNguyen

Смежные вопросы