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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

1回答

498閲覧

UISearchBarについて

退会済みユーザー

退会済みユーザー

総合スコア0

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/06/17 09:24

swift

1import UIKit 2 3class EditViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate { 4 5 @IBOutlet weak var EditViewTabelView:UITableView! 6 @IBOutlet weak var AddBtr: UIButton! 7 @IBOutlet weak var searchBar: UISearchBar! 8 var searchResults:[String] = [] 9 10 11 12 class segue{ 13 var data = [String]() 14 } 15 16 let key = segue() 17 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 22 EditViewTabelView.tableFooterView = UIView(frame: .zero) 23 EditViewTabelView.frame = CGRect(x: 0, y: 100, width: 375, height: 550) 24 AddBtr.layer.cornerRadius = 30 //角のR設定 25 AddBtr.layer.masksToBounds = true 26 self.view.backgroundColor = UIColor.rgb(r: 204, g: 250, b: 125, alpha: 1) 27 28 searchBar.placeholder = "検索したいものを入力してください" 29 searchBar.delegate = self 30 searchBar.setValue("キャンセル", forKey: "_cancelButtonText") 31 searchBar.tintColor = UIColor.red 32 searchBar.frame = CGRect(x: 0, y: 64, width: 375, height: 40) 33 34 } 35 36 @IBAction func AddBtr(_ sender: Any) { 37 let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) 38 39 // OKボタンの設定 40 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 41 (action:UIAlertAction!) -> Void in 42 43 // OKを押した時入力されていたテキストを表示 44 if let textFields = alert.textFields { 45 46 // アラートに含まれるすべてのテキストフィールドを調べる 47 for textField in textFields { 48 self.key.data.append(textField.text!) 49 self.EditViewTabelView.insertRows(at: [IndexPath(row: 0, section: 0)],with: UITableViewRowAnimation.automatic) 50 //self.EditViewTabelView?.insertRows(at: [IndexPath(row: 0, section: 0)], with: .top) 51 print(textField.text!) 52 } 53 self.EditViewTabelView.reloadData() 54 } 55 }) 56 alert.addAction(okAction) 57 58 // キャンセルボタンの設定 59 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 60 alert.addAction(cancelAction) 61 62 // テキストフィールドを追加 63 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 64 textField.placeholder = "テキスト" 65 }) 66 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 67 68 self.present(alert, animated: true, completion: nil) 69 } 70 71 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 72 if searchBar.text != "" { 73 return searchResults.count 74 } else { 75 return key.data.count 76 } 77 78 } 79 80 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 81 let Cell = tableView.dequeueReusableCell(withIdentifier: "celltext", for: indexPath) 82 83 if searchBar.text != "" { 84 Cell.textLabel!.text = "(searchResults[indexPath.row])" 85 } else { 86 Cell.textLabel?.text = key.data[indexPath.row] 87 } 88 89 return Cell 90 } 91 92 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 93 self.view.endEditing(true) 94 searchBar.showsCancelButton = true 95 self.searchResults = key.data.filter{ 96 $0.lowercased().contains(searchBar.text!.lowercased()) 97 } 98 self.EditViewTabelView.reloadData() 99 } 100 101 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 102 searchBar.showsCancelButton = false 103 self.view.endEditing(true) 104 searchBar.text = "" 105 self.EditViewTabelView.reloadData() 106 } 107 108 func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { 109 searchBar.showsCancelButton = true 110 return true 111 } 112 113}

実現したい事

サーチバーで検索するとき、入力中から絞り込みを出来るようにしたい
それとキャンセルボタンを押さなくても入力途中にサーチバー内の×をタップしたらキャンセル出来るようにしたい

出来ている事

基本的なサーチバーの実装まではなんとか出来た。

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

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

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

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

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

guest

回答1

0

ベストアンサー

UISearchBarDelegateの入力があるたびに呼ばれるメソッドで毎回絞り込み処理を実行してあげると実現できます。

バツボタンで閉じるは、入力文字が空文字かどうかで判定できるのでそちらでキャンセルと同じ処理をしてあげれば良いです。複数のアニメーションが動いてそのままでは動かなかったので0.1秒遅延させています。

swift

1 2import UIKit 3 4class EditViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate { 5 6 @IBOutlet weak var EditViewTabelView:UITableView! 7 @IBOutlet weak var AddBtr: UIButton! 8 @IBOutlet weak var searchBar: UISearchBar! 9 var searchResults:[String] = [] 10 11 12 13 class segue{ 14 var data = [String]() 15 } 16 17 let key = segue() 18 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 EditViewTabelView.tableFooterView = UIView(frame: .zero) 24 EditViewTabelView.frame = CGRect(x: 0, y: 100, width: 375, height: 550) 25 AddBtr.layer.cornerRadius = 30 //角のR設定 26 AddBtr.layer.masksToBounds = true 27 self.view.backgroundColor = UIColor.red 28 29 searchBar.placeholder = "検索したいものを入力してください" 30 searchBar.delegate = self 31 searchBar.setValue("キャンセル", forKey: "_cancelButtonText") 32 searchBar.tintColor = UIColor.red 33 searchBar.frame = CGRect(x: 0, y: 64, width: 375, height: 40) 34 35 } 36 37 @IBAction func AddBtr(_ sender: Any) { 38 let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) 39 40 // OKボタンの設定 41 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 42 (action:UIAlertAction!) -> Void in 43 44 // OKを押した時入力されていたテキストを表示 45 if let textFields = alert.textFields { 46 47 // アラートに含まれるすべてのテキストフィールドを調べる 48 for textField in textFields { 49 self.key.data.append(textField.text!) 50 self.EditViewTabelView.insertRows(at: [IndexPath(row: 0, section: 0)],with: UITableViewRowAnimation.automatic) 51 //self.EditViewTabelView?.insertRows(at: [IndexPath(row: 0, section: 0)], with: .top) 52 print(textField.text!) 53 } 54 self.EditViewTabelView.reloadData() 55 } 56 }) 57 alert.addAction(okAction) 58 59 // キャンセルボタンの設定 60 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 61 alert.addAction(cancelAction) 62 63 // テキストフィールドを追加 64 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 65 textField.placeholder = "テキスト" 66 }) 67 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 68 69 self.present(alert, animated: true, completion: nil) 70 } 71 72 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 73 if searchBar.text != "" { 74 return searchResults.count 75 } else { 76 return key.data.count 77 } 78 79 } 80 81 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 82 let Cell = tableView.dequeueReusableCell(withIdentifier: "celltext", for: indexPath) 83 84 if searchBar.text != "" { 85 Cell.textLabel!.text = "(searchResults[indexPath.row])" 86 } else { 87 Cell.textLabel?.text = key.data[indexPath.row] 88 } 89 90 return Cell 91 } 92 93 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 94 search(searchBar) 95 self.view.endEditing(true) 96 } 97 98 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 99 if searchText.isEmpty { 100 // クリアボタン押下時 101 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 102 self.searchBarCancelButtonClicked(searchBar) 103 } 104 } 105 search(searchBar) 106 } 107 108 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 109 searchBar.showsCancelButton = false 110 self.view.endEditing(true) 111 searchBar.text = "" 112 self.EditViewTabelView.reloadData() 113 } 114 115 func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { 116 searchBar.showsCancelButton = true 117 return true 118 } 119 120 func search(_ searchBar: UISearchBar) { 121 searchBar.showsCancelButton = true 122 self.searchResults = key.data.filter{ 123 $0.lowercased().contains(searchBar.text!.lowercased()) 124 } 125 self.EditViewTabelView.reloadData() 126 } 127} 128

投稿2018/06/17 10:37

_Kentarou

総合スコア8490

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

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

退会済みユーザー

退会済みユーザー

2018/06/17 15:23

ご回答ありがとうございます。こうすれば良かったんですね。 勉強になりました。
退会済みユーザー

退会済みユーザー

2018/06/24 11:54

お忙しい中すいません。 realmについてお聞きしたいことがあります。 objectクラスの中にNSDateを追加したところアンラップのエラーが出でしまい私なり色々調べてみましたが分からなくて困ってます。 エラーコードの意味は理解しているのですがコーティングの仕方が分からないです。 もしお時間ありましたらご教授願います。 https://teratail.com/questions/132346
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問