我正在开发一个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
}
}
答案 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
块
所以它看起来像
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
}
这可能有所帮助!