質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

1846閲覧

swift2.3 tableviewのsearchBar機能を実装したい

KazuakiYokoyama

総合スコア11

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/01/12 07:29

編集2017/01/12 07:34

###実現したいこと
tableview内で検索を行いたいのですが、
検索結果を配列に受け渡す部分がうまくいきません

###発生している問題
配列member2にnameとnumberの2つの値をもたせています
searchResultsにfilterを使ってtableview内の検索結果をもたせたいのですがmember2をタプルにしているためエラーが出てしまいます。

###エラーメッセージ

Value of tuple type '(number: String,name: String)' has no member 'containsString'

###該当のソースコード

import UIKit import NCMB class Member: UITableViewController, UISearchResultsUpdating { var member : Array<String> = [] var member2 : [(number:String, name:String)] = [] var searchResults : Array<String> = [] //サーチコントローラー var searchController = UISearchController(searchResultsController: nil) @IBOutlet weak var modalLabel: UILabel! override func loadView(){ super.loadView() //配列の中身全消去 member.removeAll() //member1.removeAll() member2.removeAll() let query = NCMBQuery(className: "H28mm_member") query.findObjectsInBackgroundWithBlock({(objects,error) in if error != nil { print(error) } else { for num in 0...objects.count-1 { self.member2.append(number:objects[num].objectForKey("number") as! String, name:objects[num].objectForKey("name") as! String) } self.tableView.reloadData() self.member2.sortInPlace { $0 < $1 } } }) } override func viewDidLoad() { super.viewDidLoad() self.title = "研究室メンバー" print("Member") // サーチコントローラ設定 //結果表示用のビューコントローラーに自分を設定する。 searchController.searchResultsUpdater = self searchController.hidesNavigationBarDuringPresentation = false //検索中にコンテンツをグレー表示にしない。 searchController.dimsBackgroundDuringPresentation = false searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent searchController.searchBar.sizeToFit() //テーブルビューのヘッダーにサーチバーを設定する。 tableView.tableHeaderView = searchController.searchBar } func searchBarCancelButtonClicked(searchBar: UISearchBar) { //検索フォームを空にする searchBar.text = "" } func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int){ //スコープのインデックスを取得 print(selectedScope) } func searchBar(searchBar: UISearchBar, textDidChange searchText: String){ //再検索の処理など } func searchBarSearchButtonClicked(searchBar: UISearchBar){ //検索ボタン押した時の処理 } // セルの行数 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if( searchController.searchBar.text != ""){ return searchResults.count } else{ return member2.count } } // セルの内容を変更 // データを返すメソッド override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { //セルを取得 let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") if ( searchController.searchBar.text != ""){ //セルに値を表示 cell.textLabel?.text = searchResults[indexPath.row] } else{ cell.textLabel?.text = member2[indexPath.row].name } return cell } /// セルが選択された時に呼ばれるデリゲートメソッド override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //slackとか呼び出す } //} //検索文字列変更時の呼び出しメソッド //extension Member: UISearchResultsUpdating { func updateSearchResultsForSearchController(searchController: UISearchController) { //検索文字列を含むデータを検索結果配列に格納する //ここから searchResults = member2.filter { data in return data.containsString(searchController.searchBar.text!) } //ここまで //テーブルビューを再読み込みする。 tableView.reloadData() } }

原因はわかっているのですが、ここからどうすればいいのかがわかりません。
わかる方がいらっしゃいましたら説明していただけると嬉しいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

filterで返される値は調べている配列と同じ型なのでsearchResultsの型も同じにしないといけません。

swift

1//検索結果配列 2var searchResults : [(number:String, name:String)] = []

その上で返したい値をfilterの中でtrueで返せば良いです、以下ではプロパティnumbernameどちらかがsearchController.searchBar.textと同じならtrueを返しています。

swift

1//検索文字列を含むデータを検索結果配列に格納する。 2searchResults = member2.filter { data in 3 return data.number.containsString(searchController.searchBar.text!) || data.name.containsString(searchController.searchBar.text!) 4}

投稿2017/01/12 11:09

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazuakiYokoyama

2017/01/15 07:57

詳しくありがとうございました。 プロパティのどちらかを返せばよかったのがわかりました!
KazuakiYokoyama

2017/01/15 07:57

詳しくありがとうございました。 プロパティのどちらかを返せばよかったのがわかりました!
guest

0

data.numberdata.nameで、それぞれの要素を取得できます。

投稿2017/01/12 08:08

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問