2016-05-12 120 views
0

我有一個問題,即如果用戶鍵入搜索欄中過快程序將以下消息的UITableView和異步請求

fatal error: index out of range

參照線var podInfo = podcastResults[row]這是cellForRowAtIndexPath方法的一部分崩潰。搜索框位於UITableView之上,從NSURLSession結果填充。

請參閱下面的代碼。

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 
} 

任何幫助將不勝感激,因爲我只是無法弄清楚。

乾杯。

Michael

+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

嘗試重新加載表,當您從數組中刪除所有元素ie。 self.tempDict.removeAll() self.podcastResults.removeAll()似乎表格沒有被刷新,仍然顯示現在被刪除的元素。