2017-05-10 10 views
0

私はUIRefreshControlを持っており、グローバルにオブジェクトrefreshControlを作成しました。多くの回、または1回だけリフレッシュすると、アプリケーションがクラッシュし、エラーが表示されます。致命的なエラーでテーブルビューを更新するとアプリケーションがクラッシュする:インデックスが範囲外Swift3

私のviewDidLoad機能

override func viewDidLoad() { 
    super.viewDidLoad() 

    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh") 
    refreshControl.addTarget(self, action: #selector(refresh), for: UIControlEvents.valueChanged) 
    tableView.addSubview(refreshControl) 

    tableView.register(UINib(nibName: "NewsCell", bundle: nil), forCellReuseIdentifier: "CellID") 
    tableView.rowHeight = 343 


} 

私の見解は、機能を表示します。ここでロードされたデータは、refresh()からnewsArray.removeAll()を削除し、あなたの後loadDatafromUrlからそれを行うウェブサーバ

func loadDatafromUrl(uri: String){ 

    self.refreshControl.endRefreshing() 


    print(uri) 
    if let url = URL(string: uri){ 

     let config = URLSessionConfiguration.default 
     config.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData 
     let session = URLSession(configuration: config) 

     let task = session.dataTask(with: url, completionHandler: { 

      (rawData,response,error) in 

      if error != nil { 
       print("Couldnt load data") 
       print(error?.localizedDescription as Any) 
       self.navigationItem.title = "Connecting..." 
       self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.black] 
       self.dataLoaded = false 

      } else { 

       self.dataLoaded = true 

       self.navigationItem.title = "" 
       if let data = rawData { 
        do{ 
         if let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [AnyObject]{ 

          DispatchQueue.main.async { 

           for index in 0...json.count-1 { 

            if let datas = json[index] as? [String: AnyObject] { 

             if let title = datas["title"] as? String { 
              if title != "nil" { 

               let newsObj = News() 
               newsObj.title = title 
               newsObj.body = datas["body"] as? String 
               let photo: String? = datas["photo"] as? String 
               if let phot = photo { 
                let photourl: String? = "http://qproinnovations.com/projectpreview/unaninfo/admin/uploads/" + phot 
                newsObj.photo = photourl 
                print(photourl) 
               } 
               newsObj.meta = datas["meta"] as? Int 

               self.newsArray.append(newsObj) 
              } 
             } 

            } 

           } 
           self.tableView.reloadData() 
          } 


         } 
        }catch{ 
         print("error") 

        } 
       } 
      } 
     }) 
     task.resume() 
    } 

} 

答えて

0

遅延でテーブルを再ロードします。私もその問題に直面していました。 .5遅れでテーブルをリロードすると私の仕事になりました

0

からデータをダウンロードするには、グローバル

override func viewWillAppear(_ animated: Bool) { 

    if !dataLoaded && newsArray.isEmpty { 
     let url = urls.sharedInstance.newsUrl + String(0) 
     loadDatafromUrl(uri:url) 

    } 
} 

マイリフレッシュ機能

func refresh(){ 
    newsArray.removeAll() 

    let url = urls.sharedInstance.newsUrl + String(10) 
    loadDatafromUrl(uri: url) 
} 

関数宣言ブール変数でありますあなたの応答を得て、あなたの配列を記入してください!

第2のものはwebservice callからDispatchQueue.main.asyncを削除します。そこにそれの必要はありません。必要に応じてtableviewDispatchQueue.main.asyncに再ロードすることができます。

+0

まだクラッシュしています。 –

+0

'self.refreshControl.endRefreshing()'テーブルをリロードした後、これをコンプリートブロックに入れてください!メソッドの起動から削除してください! @ YasheedMohammed – Lion

+0

私はすべてをやった。しかし、まだクラッシュ... –

関連する問題