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

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

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

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

Swift

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

Q&A

1回答

1685閲覧

ScrollView上のイベントについて

RyotaNakano

総合スコア7

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/09/07 04:55

###前提・実現したいこと

staryboardでScrollView上にテキストフィールドを複数配置し、textFieldがタップされた際のeventを取得する。

###発生している問題・エラーメッセージ

textFieldがタップされた際に呼ばれるはずのアクションメソッドが、しっかりタップをしないと呼ばれない。
軽くタップすると、textFieldに入力用のカーソルは出ますが、アクションメソッドが呼ばれないため、思うような処理が実行されない状況です。

###試したこと

eventのタイミングを色々試しましたが、解決しませんでした。
お手数ですがご教授願います。

###補足情報(言語/FW/ツール等のバージョンなど)

xcode8 beta6
swift3

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

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

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

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

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

guest

回答1

0

カーソルが入っているという事はキーボードが表示されているということですかね?
それでしたらキーボードが表示される通知を登録して表示された合図でイベントを実行するのはいかがでしょうか?

どのキーボードかは現在のFirstResponderを取得していますのでそこでtagなりで分けると良いと思います。

気になるのはアクションメソッドで、どのように定義しているのか載せていただけると他のアドバイスをできるかもしれません。

※ ちなみにSwift2で書いているので適時置き換えてください。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 6 @IBOutlet weak var textField: UITextField! 7 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 // キーボードが表示された時の通知を登録 13 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.keyboardDidShowNotification(_:)), name: UIKeyboardDidShowNotification, object: nil) 14 } 15 16 deinit { 17 // 通知を解除 18 NSNotificationCenter.defaultCenter().removeObserver(self) 19 } 20 21 func keyboardDidShowNotification(notification: NSNotification) { 22 23 print("Keyboardが表示されたよ!") 24 25 if let textField = UIResponder.currentFirstResponder() as? UITextField { 26 // TextFieldを取得 27 print(textField.text) 28 } 29 } 30} 31 32// Firstrespoonderを返すextension 33extension UIResponder { 34 35 private weak static var _currentFirstResponder: UIResponder? = nil 36 37 public class func currentFirstResponder() -> UIResponder? { 38 UIResponder._currentFirstResponder = nil 39 UIApplication.sharedApplication().sendAction(#selector(UIResponder.findFirstResponder(_:)), to: nil, from: nil, forEvent: nil) 40 return UIResponder._currentFirstResponder 41 } 42 43 internal func findFirstResponder(sender: AnyObject) { 44 UIResponder._currentFirstResponder = self 45 } 46}

Eventの取得タイプを変更

s

投稿2016/09/07 11:21

編集2016/09/08 21:54
_Kentarou

総合スコア8490

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

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

RyotaNakano

2016/09/08 00:58 編集

アドバイスありがとうございます! なるほど、キーボードの表示を検知して処理するのですね。 >カーソルが入っているという事はキーボードが表示されているということですかね? そうですね、キーボードは表示されています! >気になるのはアクションメソッドで、どのように定義しているのか載せていただけると他のアドバイスをできるかもしれません。 アクションメソッドは以下のようになります(一部分)。 @IBAction func nameEdited(_ sender: AnyObject) { ButtonActiveCheck() print("nameField") } @IBAction func sexEdited(_ sender: AnyObject) { ButtonActiveCheck() print("sexField") } @IBAction func birthEdited(_ sender: AnyObject) { ButtonActiveCheck() print("birthField") } @IBAction func typeEdited(_ sender: AnyObject) { ButtonActiveCheck() print("typeField") } 各アクションメソッドにbreakPointを設定しても止まらないので、呼ばれていないと判断しました。(しっかりタップすれば呼ばれます) pickerの処理などがあるため、キーボードが表示される前にアクションメソッドを呼ぶ必要があるのではと考えています。 どのようにしたら設定したevent通りにアクションメソッドを呼ぶことができるかがわかりません。 お手数ですが、よろしくお願いいたします。
_Kentarou

2016/09/08 21:51

表示前に処理をしたいだけであれば以下のように通知のタイプを表示後に呼ばれるものから、表示前に呼ばれるものに変更すればできます。 UIKeyboardDidShowNotification ↓ UIKeyboardWillShowNotification 自分もScrollViewに載せて動かしてみましたが、反応が悪いですね回答に追記しましたが、EventをDid Beginにするとキーボードが出る前に呼ばれました、試してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問