我最近迁移了我的 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()
}
}
}