Ios 如果我在swift 2.0中未单击ViewController上的任意位置,是否会重新加载Tableview但不显示?

Ios 如果我在swift 2.0中未单击ViewController上的任意位置,是否会重新加载Tableview但不显示?,ios,swift,Ios,Swift,我对UITableView有问题。实际上,下面的代码在其他tableview中运行良好。在我的项目中,当我单击按钮时,新的视图控制器被打开。新的视图控制器有一个UITableView从JSON动态加载tableview数据。问题是单击按钮时,tableView数据没有显示。它显示为空的白色屏幕。然后我单击视图控制器中的任意位置,然后突然显示tableview数据。我该怎么解决这个问题?提前谢谢 代码我已经试过了 import UIKit class Events: UIViewControll

我对UITableView有问题。实际上,下面的代码在其他tableview中运行良好。在我的项目中,当我单击按钮时,新的视图控制器被打开。新的视图控制器有一个
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。