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

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

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

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

Q&A

解決済

1回答

2341閲覧

touchesBeganが呼ばれません

coco7777

総合スコア8

Swift

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

0グッド

0クリップ

投稿2022/05/19 07:04

編集2022/05/22 04:20

イメージ説明イメージ説明swift初学者です。
touchesBeganが呼ばれません。
searchBarのキーボードを画面のほかスペースをタッチすることでキーボードを閉じるようにしたいです。
回答よろしくお願いします。

swift

1import UIKit 2 3class nikkiTableViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate{ 4 5 6 private let cellId = "cellId" 7 8 // let cellDateArray = [] 9 var searchBar = UISearchBar() 10 //var textField = UITextField() 11 var addBarButtonItem:UIBarButtonItem! 12 13 @IBOutlet weak var nikkiTableView: UITableView! 14 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 20 21 setupSearchBar() 22 23 addBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addBarButtonTapped(_:))) 24 addBarButtonItem.tintColor = UIColor.white 25 26 //navigationVarの右側に追加 27 self.navigationItem.rightBarButtonItem = addBarButtonItem 28 29 nikkiTableView.delegate = self 30 nikkiTableView.dataSource = self 31 searchBar.delegate = self 32 //textField.delegate = self 33 34 35 let appearance = UINavigationBarAppearance() 36 appearance.configureWithOpaqueBackground() 37 appearance.backgroundColor = .rgb(red: 173, green: 216, blue: 230) 38 39 //標準の高さ 40 navigationItem.standardAppearance = appearance 41 //ナビゲーションバーが透過する 42 navigationItem.scrollEdgeAppearance = appearance 43 //標準の文字の大きさ 44 navigationItem.compactAppearance = appearance 45 46 } 47 48 49 func setupSearchBar(){ 50 51 if let navigationBarFrame = navigationController?.navigationBar.bounds { 52 let searchBar: UISearchBar = UISearchBar(frame: navigationBarFrame) 53 searchBar.delegate = self 54 searchBar.placeholder = "タイトルで探す" 55 searchBar.tintColor = UIColor.white 56 searchBar.keyboardType = UIKeyboardType.default 57 navigationItem.titleView = searchBar 58 navigationItem.titleView?.frame = searchBar.frame 59// self.searchBar = searchBar 60 } 61 } 62 63 64 //textField以外の部分のタッチ時にキーボード閉じる 65 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 66 67 self.view.endEditing(true) 68 } 69 70 func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 71 searchBar.resignFirstResponder() 72 } 73 74 75 76 77 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 78 79 return 190 80 81 } 82 83 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 84 85 return 1 86 //self.cellDateArray.count 87 } 88 89 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 90 91 let cell = nikkiTableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) 92 93 return cell 94 //self.cellDateArray.object(at: indexPath.row) as! UITableViewCell 95 } 96 97 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 98 99 let storyboard = UIStoryboard(name: "nikkiTableView", bundle: nil) 100 let textVC = storyboard.instantiateViewController(withIdentifier: 101 "textViewController") 102 103 navigationController?.pushViewController(textVC, animated: true) 104 //タップした後、セルの色が白色に戻る 105 tableView.deselectRow(at: indexPath, animated: true) 106 107 } 108 109 //+ボタンが押されたときのメゾットー>画面遷移からの、cellの追加を書く 110 @objc func addBarButtonTapped(_ sender: UIBarButtonItem) { 111 112 let storyboard = UIStoryboard(name: "nikkiTableView", bundle: nil) 113 let textVC = storyboard.instantiateViewController(withIdentifier: 114 "textViewController") 115 116 navigationController?.pushViewController(textVC, animated: true) 117 118 } 119 120 121 122 123 } 124 125 class nikkiTableViewCell: UITableViewCell { 126 127 128 @IBOutlet weak var cafeImageView: UIImageView! 129 @IBOutlet weak var nameLabel: UILabel! 130 @IBOutlet weak var dateLabel: UILabel! 131 @IBOutlet weak var hyoukaLabel: UILabel! 132 133 134 override func awakeFromNib() { 135 super.awakeFromNib() 136 137 138 } 139 140 override func setSelected(_ selected: Bool, animated: Bool) { 141 super.setSelected(selected, animated: animated) 142 } 143 144 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://developer.apple.com/documentation/uikit/uiresponder/1621142-touchesbegan
https://developer.apple.com/documentation/uikit/uiresponder

touchesBegan(_:with:)はUIResponder(UIViewController)のメソッドのようです。
UIViewControllerの一番下にあるビューが見えている場合はそこをタップすると動くはずです。
でも、一番下にあるビューを覆うようにUITableViewがあるとタップしたことが一番下のビューまで伝わらず、
touchesBegan(_:with:)も動かないみたいです。

UITableView上で、キーボードを閉じる処理
https://qiita.com/ayukin/items/291171244f973860fdb6

リンク先にあるように、UITapGestureRecognizerを使うと希望する動きが実現できそうですがどうでしょうか。


追記です。
コメントありがとうございます。

view.endEditing(true)のViewは何を表しているのでしょうか?

このメソッドは、現在のビューとそのサブビュー階層で、現在ファーストレスポンダであるテキストフィールドを探します。見つかった場合は、そのテキストフィールドに最初のレスポンダとして辞任するように要求します。forceパラメータがtrueに設定されている場合、テキストフィールドは質問されることすらなく、強制的に辞任させられます。
https://developer.apple.com/documentation/uikit/uiview/1619630-endediting

すごく 適当 雑な説明になってしまうかもしれませんが、
テキストフィールドにフォーカスがあるときにendEditing(_:)を呼び出すと、
テキストフィールドからフォーカスを外して、
結果的にキーボードを非表示にすることができる、
ということだと思います。

テキストフィールド以外の空いているスペースをタップしても同じでしょうか?


コメントありがとうございます。
さらに追記です。

テキストフィールド以外をタップしても閉じないです

セル以外の箇所はどうでしょうか?
*セルがいっぱいでキーボードとの間に隙間はないでしょうか・・

cellをタップして遷移後戻ってきてもキーボードが閉じていない状態です

tableView(_:didSelectRowAt:)が先に動いて画面の遷移だけ処理されているのでしょうか。
tableView(_:didSelectRowAt:)の中にもendEditing(_:)を記述してみたらどうでしょうか?


コメントありがとうございます。
3つ目の追記です。

Storyboardには配置しておりません

ごめんなさい。
再現確認した際に、ナビゲーションバーにUISearchBarを配置せずに、下側の枠に配置していました。。
この場合、self.view.endEditing(true)で希望する動きになっているように見えていたようでした。

ナビゲーションバーは別のビューになるようで、次の2つのいずれかするとキーボードが閉じるように思いますがどうでしょうか。

  • searchBar.endEditing(true)
  • navigationItem.titleView?.endEditing(true)

.rgbの部分はエラーになってません UIcolorのswiftファイルを作ってそこでrgbの関数を定義しているからだと思います。(画像追加しました)

そうだったのですね。
気になっていたところでしたのでスッキリしました。
staticな関数も . から記述することができるのですね。

投稿2022/05/19 08:18

編集2022/05/22 04:55
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

coco7777

2022/05/19 13:30

たびたびありがとうございます table ViewがViewを覆っているからタッチが反応しなかったのですね、、理解できました。ありがとうございます 貼っていただいたリンク先の内容をもとにコードを書いてみたのですが、キーボードが閉じません。 dissmisskeyBoardのメゾット内にPrint(””)を入れて試してみるとXcodeの下の部分に表示されるので呼ばれてはいるみたいです。 view.endEditing(true)のViewは何を表しているのでしょうか?
coco7777

2022/05/20 13:42

回答ありがとうございます そういうことなのですね!わかりやすい説明ありがとうございます テキストフィールド以外をタップしても閉じないです cellをタップして遷移後戻ってきてもキーボードが閉じていない状態です
coco7777

2022/05/21 23:15

追記ありがとうございます cell以外のところをタップしてもダメでした その場合もprint(””)は呼ばれてます view.endEditing(true)を書くという認識で間違い無いでしょうか?コードを書いてみても閉じなかったです、、、
退会済みユーザー

退会済みユーザー

2022/05/22 00:57

コメントありがとうございます。 すみません。。 一番最初のコメントに`dissmisskeyBoard`は呼ばれているとご記載いただいていましたね。 > view.endEditing(true)を書くという認識で間違い無いでしょうか? これで間違いないと思います。 Storyboardの設定がどこか違うのでしょうか。。 念の為、”質問欄の編集”から、実行時のキーボードが表示されている時の画面を貼り付けていただけますでしょうか。 それから、XcodeのバージョンとmacOSのバージョンもご記載いただけますでしょうか。
coco7777

2022/05/22 03:00

xg63ex2b様 画像の方追加しました。 Xcodeのバージョン 13.4 macOSのバージョン 12.3.1 です。 たびたび申し訳ありません。よろしくお願いします
退会済みユーザー

退会済みユーザー

2022/05/22 03:50

コメントありがとうございます。 > 画像の方追加しました。 ありがとうございます。 これだけだと悪いところはなさそうで、原因はわからなそうですね。。 > Xcodeのバージョン 13.4 > macOSのバージョン 12.3.1 私の環境はXcodeが13.3.1、macOSが12.3.1なので、私の方が古いのですね。。 関係ないかもしれませんが、 質問欄のコードにつきまして、 `appearance.backgroundColor = .rgb(red: 173, green: 216, blue: 230)` の.rgbの部分がエラーになるため、 コメントアウトして確認していました。 coco7777様の環境ではこの行でビルドエラーにならないでしょうか? わからないですが、試してみてもらいたい点を書いてみます。 1. `searchBar.resignFirstResponder()` の行にブレイクポイントを設定して、 セル以外の場所をタップした場合に引っかかりますでしょうか? 2. `var searchBar = UISearchBar()` `let searchBar: UISearchBar = UISearchBar(frame: navigationBarFrame)` UISearchBarのインスタンスが生成されている箇所が2つあるようです。 画面に表示されているインスタンスをちゃんと操作できているか怪しい気もします。 Storyboardではどのような感じでしょうか? StoryboardにもUISearchBarを配置していたとすると、3つインスタンスが存在することになると思います。 UISearchBarのインスタンスが1つになるように整理すると良いと思います。
coco7777

2022/05/22 04:19

回答ありがとうございます .rgbの部分はエラーになってません UIcolorのswiftファイルを作ってそこでrgbの関数を定義しているからだと思います。(画像追加しました) 1. セル以外の場所をタップしただけでは引っかかりませんが、何か文字を入れて『検索』を押すと引っかかります。その時、キーボードも閉じてくれます。 2. ご指摘ありがとうございます! そこは自分で直してみたのですが、改善されませんでした。 Storyboardには配置しておりません
coco7777

2022/05/22 07:53

コメントありがとうございます >ごめんなさい。 再現確認した際に、ナビゲーションバーにUISearchBarを配置せずに、下側の枠に配置していました。。 この場合、self.view.endEditing(true)で希望する動きになっているように見えていたようでした。 とんでも無いです、、 わざわざ再現までしてくださったのですね、本当にありがとうございます! searchBar.endEditing(true) の場合は Cannot find 'searchBar' in scope とエラーが出ましたが navigationItem.titleView?.endEditing(true) の方で記述すると改善されました!! ナビゲーションバーの場合は違うコードになるのですね、勉強になりました。 >気になっていたところでしたのでスッキリしました。 staticな関数も . から記述することができるのですね。 よかったです! 何度も何度も丁寧に回答してくだっさってありがとうございました!!  またよろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問