我最近迁移了我的iOS应用程序以支持使用Swift 2.3的iOS 10,并且遇到了以前在iOS 9 / Swift上运行良好的问题。
问题是这样的:
我有一个UITableView
加载了部分和行,在第一个实例中,一切都很好。但是,当我进行刷新时,我正在通过totalSectionData.removeAllObjects()
清除阵列。现在,当执行刷新时,它会抛出错误[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array
。很明显,我在清除数组后调用函数从服务器重新加载数据。
在进一步调查和提出断点时,我发现当我刷新时,它不会进入numberOfSectionsInTableView
和numberOfRowsInSection
。它第一次进入它内部。 tableView
和委托已正确连接。
如果我评论totalSectionData.removeAllObjects()
然后它工作正常但我得到重复的行。
以前的iOS 9 / Swift 2工作正常,我在之前的版本上再次测试了代码以进行双重确认。
iOS 10 / Swift 2.3中是否有任何新功能,我缺少/做错了。
刷新代码:
func refresh(sender:AnyObject)
{
// Code to refresh table view
tableView.allowsSelection = false
totalSectionData.removeAllObjects()
get_data_from_url(json_data_url)
}
收到JSON数据后,我正在调用reloadData
func do_table_refresh()
{
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
self.refreshControl.endRefreshing()
self.hideActivityIndicator()
self.tableView.allowsSelection = true
return
})
}
// Fetch JSON
func get_data_from_url(url:String)
{
let url:NSURL = NSURL(string: url)!
let session = NSURLSession.sharedSession()
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "GET"
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
tableView.allowsSelection = false
let task = session.dataTaskWithRequest(request) {
(
data, response, error) in
guard let _:NSData = data, let _:NSURLResponse = response where error == nil else {
print("error")
return
}
self.showActivityIndicator()
dispatch_async(dispatch_get_main_queue(), {
let json = NSString(data: data!, encoding: NSASCIIStringEncoding)
self.extract_json(json!)
// self.activityIndicator.stopAnimating()
return
})
}
task.resume()
}
func extract_json(data:NSString)
{
var parseError: NSError?
let jsonData:NSData = data.dataUsingEncoding(NSASCIIStringEncoding)!
let json: AnyObject?
do {
json = try NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
} catch let error as NSError {
parseError = error
json = nil
}
if (parseError == nil)
{
if let list:NSArray = json as? NSArray
{
print ("Inside if let")
let lblArray:NSArray = (list.valueForKey("level_number") as?NSArray)!
let data = NSOrderedSet(array: lblArray as [AnyObject])
for value in data {
let resultPredicate : NSPredicate = NSPredicate(format: "level_number == %d", value.integerValue)
let arrayData:NSArray = list.filteredArrayUsingPredicate(resultPredicate)
let lblArray:NSArray = (arrayData.valueForKey("part_number") as?NSArray)!
let dataValue = NSOrderedSet(array: lblArray as [AnyObject])
for index in dataValue {
let resultPredicate : NSPredicate = NSPredicate(format: "part_number == %d", index.integerValue)
totalSectionData.addObject(arrayData.filteredArrayUsingPredicate(resultPredicate))
}
}
for i in 0 ..< list.count
{
if let data_block = list[i] as? NSDictionary
{
TableData.append(datastruct(add: data_block))
}
}
do
{
try read()
}
catch
{
}
do_table_refresh()
}
}
}