2016-08-18 6 views
1

私は迅速にスターターです。 jsonFileからtableviewを作成してデータを取得し、テキストと画像を表示します。 次に、searchBarをtableviewに追加したいのですが、問題があります。即決で複数の値を返す方法

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が表示されます。フィルタリングされた名前が返され、エピソードがエラーインデックスを範囲外に示します。 私はそれを修正する方法がわかりません。あなたは2つの値を返すようにしたい場合は

+1

'return'メソッドが存在し、このような連続するreturn文を持つことはできません。そのうちの1つがヒットすると、値が返され、メソッドが終了します。複数のデータを返す方法として、タプル、構造体、オブジェクト、またはコレクションを返すことができますが、この場合、メソッドシグニチャを満たすために1つの 'Int'を返す必要があります。 – Alexander

+0

ありがとうございます。私に考えがある。 – JetSky

答えて

1

はちょうどそうのようなtoupleを返す:

リターン(データ型、データ型)

ので、これは

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

可能性があり、あなたはそうのようにそれにアクセスします:

let (myString, myObject) = returnTouple() 

およびmyString == "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 
} 

、両方がreturnTouple().0 == "Hello World"

次のように0.0と0.1をthroughtアクセスすることができました。両方のセクションにreturn文を持つif {} else {}があります。 if {} else if {}と言っている場合を除き、これは第三の道の復帰文を打つことは不可能です。

関連する問題