TableView.reloadData()不起作用? (迅速)

时间:2015-09-08 12:04:48

标签: ios arrays swift uitableview alamofire

我正在开发一个Quiz App,它从JSON中提取问题。我已经多次使用reloadData for TableView&按预期工作。但现在我正在使用Alamofire& amp;将它保存在数组&从数组中获取问题。

但它返回的数组是超出索引。

如何在第一个Cell中显示数组的第一项?

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

        }
    }

3 个答案:

答案 0 :(得分:2)

使用调度队列在.responseJSON中调用完成处理程序,然后更新您的UI。

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()
     })
}

答案 1 :(得分:0)

听起来您需要将重新加载到完成处理程序中,以便在尝试更新UI时获得数据。

为了安全起见(如果是其他来电重新加载),您还可以通过检查numberOfRowsInSection中是否至少有5个项目来保护QArray中的返回值。

答案 2 :(得分:0)

您需要在Alamofire

中重新加载您的tableview

所以它看起来像

  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
}

这可能有所帮助!