Pull to refresh在Swift 3 iOS 10

时间:2016-09-15 03:07:57

标签: ios10 swift2.3

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

        }

    }
}

0 个答案:

没有答案