0

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