2016-05-12 23 views
0

私は検索バーにユーザーの種類があまりにも速くプログラムはcellForRowAtIndexPath方法の一部であるラインvar podInfo = podcastResults[row]を参照する次のメッセージのUITableViewと非同期リクエストは

fatal error: index out of range

でクラッシュする場合は問題があります。検索ボックスはNSURLSessionの結果から設定されたUITableViewの上にあります。

下記のコードをご覧ください。

class SearchTVC: UITableViewController, UISearchBarDelegate { 

    @IBOutlet weak var searchBar: UISearchBar! 
    var podcastResults = [[String: String]]() 
    var tempDict = [String: String]() 

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 

    print("search being typed") 

    if searchText.characters.count >= 3 { 

     let searchesArray:Array = searchText.componentsSeparatedByString(" ") 

     //request search method to start 

     search(searchesArray) 
    } 
} 

func search(searchqueries: Array<String>){ 


    let URL = iTunesSearcher().searchQuery(searchqueries) //This just complies the URL using a method in anothr class 


    let task = NSURLSession.sharedSession().dataTaskWithURL(URL) { 
     (data, response, error) in 
     print("URL downloaded") 

     //clear results and temp dict, so that new results can be displayed 

     self.tempDict.removeAll() 
     self.podcastResults.removeAll() 

     let data = NSData(contentsOfURL: URL) //urlString! 
     let json = JSON(data: data!) 

     for (key, subJson) in json["results"] { 

      if let title = subJson["collectionCensoredName"].string { 

       self.tempDict = ["title": title] 

      } else { print("JSON - no title found") } 

      if let feedURL = subJson["feedUrl"].string { 

       self.tempDict.updateValue(feedURL, forKey: "feedURL") 

      } else { print("JSON - no feedURL found") } 

      if let artworkUrl60 = subJson["artworkUrl60"].string { 

       self.tempDict.updateValue(artworkUrl60, forKey:"artworkURL60") 

      } else { print("JSON - no artwork url found") } 

      self.podcastResults.append(self.tempDict) 
     } 

     //Running request on main thread 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 

      self.tableView.reloadData() 

     }) 
    } 

    task.resume() 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = self.tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) 

    let row = indexPath.row 
    var podInfo = podcastResults[row] 
    cell.textLabel?.text = podInfo["title"] 
    return cell 
} 

私はちょうどそれを理解することができないので、どんな助けも大いに評価されるでしょう。

乾杯。マイケル

+0

あなたの 'numberOfRows'メソッドが返すもの – Shubhank

答えて

0

UITableViewDataSourceに返す行の数がself.podcastResults.countであると仮定しています。セルが要求されていない問題は、インデックスが範囲外になることはありませんことを保証します

let row = indexPath.row 
var podInfo = podcastResults[row] 
cell.textLabel?.text = podInfo["title"] 

let row = indexPath.row 
if row < podcastResults.count { 
    var podInfo = podcastResults[row] 
    cell.textLabel?.text = podInfo["title"] 
} 

これを

に(と私: はもしそうなら、何をする必要があると、これを回しています要求ハンドラの配列からすべての要素を削除した後にこれが発生すると考えてください)。

0

あなたはつまり、あなたの配列からすべての要素を削除し、テーブルを再読み込みしてみてください。 self.tempDict.removeAll() self.podcastResults.removeAll()テーブルが更新されず、実際に削除された要素がまだ表示されているようです。

関連する問題