Ios 如果我在swift 2.0中未单击ViewController上的任意位置,是否会重新加载Tableview但不显示?
我对UITableView有问题。实际上,下面的代码在其他tableview中运行良好。在我的项目中,当我单击按钮时,新的视图控制器被打开。新的视图控制器有一个Ios 如果我在swift 2.0中未单击ViewController上的任意位置,是否会重新加载Tableview但不显示?,ios,swift,Ios,Swift,我对UITableView有问题。实际上,下面的代码在其他tableview中运行良好。在我的项目中,当我单击按钮时,新的视图控制器被打开。新的视图控制器有一个UITableView从JSON动态加载tableview数据。问题是单击按钮时,tableView数据没有显示。它显示为空的白色屏幕。然后我单击视图控制器中的任意位置,然后突然显示tableview数据。我该怎么解决这个问题?提前谢谢 代码我已经试过了 import UIKit class Events: UIViewControll
UITableView
从JSON动态加载tableview数据。问题是单击按钮时,tableView数据没有显示。它显示为空的白色屏幕。然后我单击视图控制器中的任意位置,然后突然显示tableview数据。我该怎么解决这个问题?提前谢谢
代码我已经试过了
import UIKit
class Events: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
retrieveDataFromJASON()
}
var events: [[String: AnyObject]] = [[String: AnyObject]]()
var dateAndTime: [[String: AnyObject]] = [[String: AnyObject]]()
func retrieveDataFromJASON() {
let URL = NSURL(string: "http://portal.shineevents.co.in/portal/api_load/app_load_call")
let requestURL = NSMutableURLRequest(URL: URL!)
requestURL.HTTPMethod = "POST"
let postString = "api=event_list"
requestURL.addValue("123456", forHTTPHeaderField: "X-API-KEY")
requestURL.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(requestURL) { data, response, error in
guard error == nil && data != nil else {
print("error=\(error)")
return
}
if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
let responseString2 = try! NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
//print(responseString2) /*prints whole JSON Data*/
self.events = (responseString2["event_listing"] as? [[String: AnyObject]])!
self.tableView.reloadData()
//print(self.events[0]["event_details"])
}
task.resume()
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return events.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("eventCell", forIndexPath: indexPath) as! EventTableViewCell
cell.eventName.text = events[indexPath.row]["event_details"] as? String
cell.eventDate.text = events[indexPath.row]["modified_date"] as? String
cell.eventTime.hidden = true
cell.rowNumber.text = String(indexPath.row + 1)
return cell
}
}
屏幕快照1:起初没有显示任何数据(15秒后显示)
SCENSHOT2:当我单击它时,表视图会突然显示数据。(2秒以下)
看起来您需要在主线程上调度该更新:
dispatch_async(dispatch_get_main_queue(),{
self.events = (responseString2["event_listing"] as? [[String: AnyObject]])!
self.tableView.reloadData()
})
从
加载请求完成时要调用的完成处理程序。此处理程序在委托队列上执行
看起来您需要在主线程上调度该更新:
dispatch_async(dispatch_get_main_queue(),{
self.events = (responseString2["event_listing"] as? [[String: AnyObject]])!
self.tableView.reloadData()
})
从
加载请求完成时要调用的完成处理程序。此处理程序在委托队列上执行
您必须在UI线程上进行更新。为此,您必须在主队列上进行调用,您可以使用dispatch\u async()获得该调用。所以,你必须这样做:
dispatch_async(dispatch_get_main_queue()) {
self.table.reloadData()
}
您必须在UI线程上进行更新。为此,您必须在主队列上进行调用,您可以使用dispatch\u async()获得该调用。所以,你必须这样做:
dispatch_async(dispatch_get_main_queue()) {
self.table.reloadData()
}
您需要在视图中添加活动指示器,以显示它正在处理请求,并在主线程中重新加载
tableView
首先在viewController中添加activityIndicator实例和这两个方法
var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
func activityIndicatorBegin() {
activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0,0,50,50))
activityIndicator.center = self.view.center
activityIndicator.hidesWhenStopped = true
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
disableUserInteraction()
greyView = UIView()
greyView.frame = CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height)
greyView.backgroundColor = UIColor.blackColor()
greyView.alpha = 0.5
self.view.addSubview(greyView)
}
func activityIndicatorEnd() {
self.activityIndicator.stopAnimating()
enableUserInteraction()
self.greyView.removeFromSuperview()
}
现在在您的retrieveDataFromJASON
中调用此方法,如下所示
func retrieveDataFromJASON() {
self.activityIndicatorBegin()
let URL = NSURL(string: "http://portal.shineevents.co.in/portal/api_load/app_load_call")
let requestURL = NSMutableURLRequest(URL: URL!)
requestURL.HTTPMethod = "POST"
let postString = "api=event_list"
requestURL.addValue("123456", forHTTPHeaderField: "X-API-KEY")
requestURL.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(requestURL) { data, response, error in
activityIndicatorEnd()
guard error == nil && data != nil else {
print("error=\(error)")
return
}
if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
let responseString2 = try! NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
//print(responseString2) /*prints whole JSON Data*/
self.events = (responseString2["event_listing"] as? [[String: AnyObject]])!
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
//print(self.events[0]["event_details"])
}
task.resume()
}
注意-如果要在多个控制器中使用这些指示器,请选中此复选框,它将帮助您。您需要在视图中添加活动指示器,以显示它正在处理请求,并在主线程中重新加载
tableView
首先在viewController中添加activityIndicator实例和这两个方法
var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
func activityIndicatorBegin() {
activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0,0,50,50))
activityIndicator.center = self.view.center
activityIndicator.hidesWhenStopped = true
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
disableUserInteraction()
greyView = UIView()
greyView.frame = CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height)
greyView.backgroundColor = UIColor.blackColor()
greyView.alpha = 0.5
self.view.addSubview(greyView)
}
func activityIndicatorEnd() {
self.activityIndicator.stopAnimating()
enableUserInteraction()
self.greyView.removeFromSuperview()
}
现在在您的retrieveDataFromJASON
中调用此方法,如下所示
func retrieveDataFromJASON() {
self.activityIndicatorBegin()
let URL = NSURL(string: "http://portal.shineevents.co.in/portal/api_load/app_load_call")
let requestURL = NSMutableURLRequest(URL: URL!)
requestURL.HTTPMethod = "POST"
let postString = "api=event_list"
requestURL.addValue("123456", forHTTPHeaderField: "X-API-KEY")
requestURL.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(requestURL) { data, response, error in
activityIndicatorEnd()
guard error == nil && data != nil else {
print("error=\(error)")
return
}
if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
let responseString2 = try! NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
//print(responseString2) /*prints whole JSON Data*/
self.events = (responseString2["event_listing"] as? [[String: AnyObject]])!
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
//print(self.events[0]["event_details"])
}
task.resume()
}
注意-如果您想在多个控制器中使用这些指示器,请选中此复选框,这将对您有所帮助。只需将self.tableView.reloadData()放入主队列块中就足够了。只需将self.tableView.reloadData()放入在主队列区应该足够了。哇,回答很好。即使添加活动指示器也很棒。谢谢Nirav先生:)欢迎伴侣,快乐编码:)哇,回答很好。即使添加活动指示器也很棒。谢谢Nirav先生:)欢迎伴侣,快乐编码:)很有效!谢谢Mayank Baiswar先生!与我在回答中的问题相比,这是一个小小的变化
self.tableView.reloadData()
:对不起!我是说你用tableView制作的IBOutlet。它很管用!谢谢Mayank Baiswar先生!与我在回答中的问题相比,这是一个小小的变化self.tableView.reloadData()
:对不起!我是说你用tableView制作的IBOutlet。