2016-08-18 61 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返回语句不可能命中,所以它不应该在那里。