0

我最近迁移了我的 iOS 应用程序以支持带有 Swift 2.3 的 iOS 10,并且遇到了以前在 iOS 9 / Swift 上运行良好的问题。

问题是这样的:

我有一个UITableView加载部分和行的,在第一个实例中,一切都加载得很好。但是当我拉动刷新时,我正在清除数组totalSectionData.removeAllObjects()。现在执行刷新时会抛出错误[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array。很明显,我在清除数组后调用该函数从服务器重新加载数据。在进一步调查和设置断点时,我发现它并没有进入内部numberOfSectionsInTableViewnumberOfRowsInSection而我确实刷新了;第一次它确实进入了它。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()

        }

    }
}
4

0 回答 0