Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 刷新tableview时应用程序崩溃,出现致命错误:索引超出范围Swift3_Ios_Swift_Uitableview - Fatal编程技术网

Ios 刷新tableview时应用程序崩溃,出现致命错误:索引超出范围Swift3

Ios 刷新tableview时应用程序崩溃,出现致命错误:索引超出范围Swift3,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个UIRefreshControl并创建了一个对象refreshControl作为全局。应用程序在多次或仅一次刷新时崩溃,并显示错误 我的viewDidLoad函数 override func viewDidLoad() { super.viewDidLoad() refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh") refreshControl.addTarg

我有一个UIRefreshControl并创建了一个对象refreshControl作为全局。应用程序在多次或仅一次刷新时崩溃,并显示错误

我的viewDidLoad函数

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refreshControl.addTarget(self, action: #selector(refresh), for: UIControlEvents.valueChanged)
    tableView.addSubview(refreshControl)

    tableView.register(UINib(nibName: "NewsCell", bundle: nil), forCellReuseIdentifier: "CellID")
   tableView.rowHeight = 343


}
我的视图将显示为函数。此处加载的数据是全局声明的布尔变量

override func viewWillAppear(_ animated: Bool) {

    if !dataLoaded && newsArray.isEmpty {
       let url = urls.sharedInstance.newsUrl + String(0)
       loadDatafromUrl(uri:url)

    }
}
我的刷新功能

 func refresh(){
    newsArray.removeAll()

    let url = urls.sharedInstance.newsUrl + String(10)
    loadDatafromUrl(uri: url)
}
函数从Web服务器下载数据

func loadDatafromUrl(uri: String){

    self.refreshControl.endRefreshing()


    print(uri)
    if let url = URL(string: uri){

        let config = URLSessionConfiguration.default
        config.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData
        let session = URLSession(configuration: config)

        let task = session.dataTask(with: url, completionHandler: {

            (rawData,response,error) in

            if error != nil {
                print("Couldnt load data")
                print(error?.localizedDescription as Any)
                self.navigationItem.title = "Connecting..."
                self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.black]
                self.dataLoaded = false

            } else {

                self.dataLoaded = true

                self.navigationItem.title = ""
                if let data = rawData {
                    do{
                        if let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [AnyObject]{

                            DispatchQueue.main.async {

                                for index in 0...json.count-1 {

                                    if let datas = json[index] as? [String: AnyObject] {

                                        if let title = datas["title"] as? String {
                                            if title != "nil" {

                                                let newsObj = News()
                                                newsObj.title = title
                                                newsObj.body = datas["body"] as? String
                                                let photo: String? = datas["photo"] as? String
                                                if let phot = photo {
                                                    let photourl: String? = "http://qproinnovations.com/projectpreview/unaninfo/admin/uploads/" + phot
                                                    newsObj.photo = photourl
                                                    print(photourl)
                                                }
                                                newsObj.meta = datas["meta"] as? Int

                                                self.newsArray.append(newsObj)
                                            }
                                        }

                                    }

                                }
                                 self.tableView.reloadData()
                            }


                        }
                    }catch{
                        print("error")

                    }
                }
            }
        })
        task.resume()
    }

}

refresh()
中删除
newsArray.removeAll()
,并在收到响应后从
loadDatafromUrl
中执行此操作,然后填充数组


第二件事是从
webservice调用中删除
DispatchQueue.main.async
。那里不需要它。如果需要,您可以在
DispatchQueue.main.async
中重新加载
tableview

延迟重新加载表格。我也面临着这个问题。以偶数.5延迟重新加载表对我来说有效

仍然崩溃。
self.refreshControl.endRefreshing()
重新加载表后,将其放入完成块!并将其从方法的开始处删除@YasheedMohammed检查您的响应数据。确保它不是
nil
,或者它的格式与解析它的方式相同!尝试所有仍然崩溃