Ios 刷新tableview时应用程序崩溃,出现致命错误:索引超出范围Swift3
我有一个UIRefreshControl并创建了一个对象refreshControl作为全局。应用程序在多次或仅一次刷新时崩溃,并显示错误 我的viewDidLoad函数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
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
,或者它的格式与解析它的方式相同!尝试所有仍然崩溃