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

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

ただいまの
回答率

90.85%

  • Swift 2

    1322questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 426

実現したいこと

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()
    }

}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/15 16:57

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


    キャンセル

  • 2017/01/15 16:57

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


    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift 2

    1322questions

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