2016-08-18 60 views
1

我是swift的入門者。 我創建tableview並從jsonFile獲取數據以顯示文本和圖片。 然後,我想在tableview上添加searchBar,但有問題。如何在swift中返回多個值

import UIKit 

    class EpisodesTableViewController: UITableViewController 
    { 
     var episodes = [Episode]() 

     var names = [Episode]() 

     let searchController = UISearchController(searchResultsController: nil) 
     var filteredNames = [Episode]() 

     func filterContentForSearchText(searchText: String) { 
      filteredNames = self.names.filter { name in 
       return name.title!.lowercaseString.containsString(searchText.lowercaseString) 
      } 
      tableView.reloadData() 
     } 





     override func viewDidLoad() 
     { 
      super.viewDidLoad() 


      searchController.searchResultsUpdater = self 
      searchController.dimsBackgroundDuringPresentation = false 
      definesPresentationContext = true 
      tableView.tableHeaderView = searchController.searchBar 

      tableView.setContentOffset(CGPoint(x: 0, y: searchController.searchBar.frame.size.height), animated: false) 

      tableView.estimatedRowHeight = tableView.rowHeight 
      tableView.rowHeight = UITableViewAutomaticDimension 
      tableView.separatorStyle = .None 

      self.episodes = Episode.downloadAllEpisodes() 
      self.tableView.reloadData() 
     } 

     override func preferredStatusBarStyle() -> UIStatusBarStyle { 
      return .LightContent 
     } 

     // MARK: - Table view data source 

     override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
     { 
      return 1 
     } 

     override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
     { 
      if searchController.active && searchController.searchBar.text != ""{ 
       return filteredNames.count 
      }else{ 
       return names.count 
      } 
      return episodes.count 
     } 

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

      let cell = tableView.dequeueReusableCellWithIdentifier("Episode Cell", forIndexPath: indexPath) as! EpisodeTableViewCell 
      let episode = self.episodes[indexPath.row] 

      let data: Episode 

      if searchController.active && searchController.searchBar.text != "" { 
       data = filteredNames[indexPath.row] 
      } 
      else { 
       data = names[indexPath.row] 
      } 

      let titleName = data.title! 

      cell.episode = episode 
      cell.textLabel?.text = titleName 

      return cell 
     } 

     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
      if segue.identifier == "SendData"{ 
       if let detailPage = segue.destinationViewController as? detailEpisodeViewController { 
        if let indexpath = tableView.indexPathForSelectedRow { 
         let episode = episodes[indexpath.row] 
         detailPage.episode = episode 
        } 
       } 
     } 
    } 

} 


    extension EpisodesTableViewController: UISearchResultsUpdating { 

     func updateSearchResultsForSearchController(searchController: UISearchController) { 
      filterContentForSearchText(searchController.searchBar.text!) 
     } 
    } 

這是我的代碼。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
     { 
      if searchController.active && searchController.searchBar.text != ""{ 
       return filteredNames.count 
      }else{ 
       return names.count 
      } 
      return episodes.count 
     } 

當我返回filteredNames和名稱界面只顯示seachbar。如果我返回過濾的名稱並且劇集顯示錯誤索引超出範圍。 我不知道如何解決這個問題。

+1

'return'存在的方法,你不能有這樣的連續返回語句。當他們中的一個被擊中時,返回值並退出方法。您可以返回元組,結構體,對象或集合作爲返回多個數據片段的一種方式,但在這種情況下,您必須返回一個'Int'來滿足方法簽名。 – Alexander

+0

謝謝。我有想法。 – JetSky

回答

1

如果你想返回兩個值只返回,就像這樣touple:

回報(數據類型,數據類型)

所以這可能是

func returnTouple() -> (String, AnyObject) { 
    return ("Hello World", 1) 
} 

那麼你將訪問它像這樣:

let (myString, myObject) = returnTouple() 

and myString == "Hello World"

你也可以同時訪問throught 0.0和0.1一樣returnTouple().0 == "Hello World"

接下來,

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if searchController.active && searchController.searchBar.text != "" { 
     return filteredNames.count 
    } else { 
     return names.count 
    } 
    return episodes.count 
} 

此功能不應該工作。你有一個if {} else {}與兩個部分的return語句。除非你說if {} else if {}這使thrid返回語句不可能命中,所以它不應該在那裏。