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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2618閲覧

【Swift4】UISearchController.SearchBarに文字を入力出来ない

grief137

総合スコア14

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/11/04 14:50

UITableViewにRealmで取得したデータを、UISearchControllerを使用してフィルターをかけたデータ一覧を表示したいのですが、シュミレーター上でSearchBarをタップしても入力欄に文字を入力出来ずに閉じてしまいます。

原因がわからないので、どこがいけないのかアドバイスを頂きたいです。

###該当ソース
Realmで取得したデータ(Words)をArrayに変換してwordListに格納しています。
SearchBarで入力した文字でfilterした配列をfilteredWordsに格納してtableViewに表示しようとしていますが、入力文字が空でもfilteredWordsに格納できていないです。

model

1class Words{ 2 @objc dynamic var wordId: String? = NSUUID().uuidString 3 @objc dynamic var word: String? = "" 4 @objc dynamic var categoryId: Int = 0 5 @objc dynamic var categoryName: String? = "" 6 let category = LinkingObjects(fromType: Category.self, property: "words") 7 8 @objc dynamic var userId: String? = "" 9 @objc dynamic var ideaFlag: Int = 0 10 11 override class func primaryKey() -> String { 12 return "wordId" 13 } 14}

ViewController

1//抜粋 2 3 //display tableview header 4 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 5 let headerview = UIView() 6 headerview.backgroundColor = UIColor.white 7 8 let cell = tableView.dequeueReusableCell(withIdentifier:"WordItemCell") as! WordTableViewCell 9 cell.delegate = self 10 cell.dropdown.dataSource = arrayCategoryList() 11 12 searchController = UISearchController(searchResultsController: nil) 13 searchController.searchResultsUpdater = self 14 searchController.searchBar.sizeToFit() 15 searchController.dimsBackgroundDuringPresentation = false 16 searchController.hidesNavigationBarDuringPresentation = false 17 searchController.searchBar.placeholder = "Search" 18 self.definesPresentationContext = true 19 20 if #available(iOS 11.0, *) { 21 headerview.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 45) 22 cell.frame = CGRect(x:0, y:0, width:self.view.frame.size.width, height:44) 23 self.navigationItem.searchController = searchController 24 } else { 25 headerview.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 100) 26 cell.frame = CGRect(x:0, y:55, width:self.view.frame.size.width, height:44) 27 searchController.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50) 28 headerview.addSubview(searchController.searchBar) 29 } 30 31 headerview.addSubview(cell) 32 33 return headerview 34 } 35 36//SearchController SearchResultUpdating 37extension ViewController: UISearchResultsUpdating{ 38 func updateSearchResults(for searchController: UISearchController) { 39 filterContentForSearchText(searchController.searchBar.text!) 40 } 41 42 func searchBarIsEmpty() -> Bool { 43 // Returns true if the text is empty or nil 44 return searchController.searchBar.text?.isEmpty ?? true 45 } 46 47 func filterContentForSearchText(_ searchText: String) { 48 //wordList:[Words] = Array(realm.object(Words.self)) 49 //filteredWords = [Words]() 50 filteredWords = wordList.filter({( words : Words) -> Bool in 51 return words.word!.lowercased().contains(searchText.lowercased()) 52 }) 53 tableView.reloadData() 54 } 55} 56

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードが部分的すぎるので試してませんがupdateSearchResultsは文字が入力されるたびに呼ばれるので
文字が入力されるとfilterContentForSearchTextでtableViewがリロードされてしまい
searchControllerがtableViewのヘッダー内にあるのでviewForHeaderInSectionが再度呼び出されて初期化されてしまうのが原因ではないでしょうか?

原因の切り分けとしてはtableViewとは独立した場所において問題が発生しないかどうか。
searchControllerをtableViewのヘッダーにaddしなければいけない理由がないのであれば別の場所におく。
置かなければいけない理由があるのであれば、すでに存在していれば初期化しない、もしくは既存の文字を保存しておいて初期値とする、といった感じでしょうか。

解決しない、不明点などあればコメントください。

投稿2018/11/08 07:23

razuma

総合スコア1313

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

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

grief137

2018/11/08 15:01

ご回答ありがとうございます。 そして入力出来ない件は解決しました。本当にありがとうございます! (ちょうど記載いただいたQiitaの記事を参考に実装しておりました。笑) ご指摘の通り、tableをリロードしていたことでsearchControllerが初期化されていたことが原因でした。 取り敢えずリロードを外せば入力されるたびにupdateSearchResultsで文字を確認することが出来ましたので、ヘッダーの仕様はこれから考えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問