最近、Swift 2.3 で iOS 10 をサポートするように iOS アプリを移行しましたが、以前は 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()
}
}
}