web-dev-qa-db-ja.com

iOS / Swift:UITextFieldでタッチアクションを検出する方法

UITextFieldのタッチアクションを検出したいと思います。

「Touch Up Inside」アクションは、テキストフィールド内をタッチしても起動されないようです。

27
Daniele B

「Touch Up Inside」はUITextFieldに対して有効になっていないようですが、「Touch Down」は機能します。

そのため、解決策は次のとおりです。

Swift 4.x

myTextField.addTarget(self, action: #selector(myTargetFunction), for: .touchDown)
@objc func myTargetFunction(textField: UITextField) {
    print("myTargetFunction")
}

Swift 3.x

myTextField.addTarget(self, action: #selector(myTargetFunction), for: UIControlEvents.touchDown)

@objc func myTargetFunction(textField: UITextField) {
    print("myTargetFunction")
}
54
Daniele B

スウィフト4-5:

class ViewController: UIViewController, UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == myTextField {
            print("You edit myTextField")
        }
    }
}

これはデリゲート関数です。

22

swfitは次のとおりです。

「touchUpInside」を使用する必要はありません。次のようにデリゲートメソッドを使用します。

Viewコントローラーをデリゲートにします。

class ViewController: UIViewController, UITextFieldDelegate{

func textFieldDidBeginEditing(textField: UITextField) -> Bool {
    if textField == myTextField {
        return true // myTextField was touched
    }
}

他のデリゲートメソッドは次のとおりです。

protocol UITextFieldDelegate : NSObjectProtocol {

    optional func textFieldShouldBeginEditing(textField: UITextField) -> Bool // return NO to disallow editing.
    optional func textFieldDidBeginEditing(textField: UITextField) // became first responder
    optional func textFieldShouldEndEditing(textField: UITextField) -> Bool // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
    optional func textFieldDidEndEditing(textField: UITextField) // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called

    optional func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool // return NO to not change text

    optional func textFieldShouldClear(textField: UITextField) -> Bool // called when clear button pressed. return NO to ignore (no notifications)
    optional func textFieldShouldReturn(textField: UITextField) -> Bool // called when 'return' key pressed. return NO to ignore.
}

from Swift docs:

struct UIControlEvents : RawOptionSetType {
    init(_ rawValue: UInt)
    init(rawValue: UInt)

    static var TouchDown: UIControlEvents { get } // on all touch downs
    static var TouchDownRepeat: UIControlEvents { get } // on multiple touchdowns (tap count > 1)
    static var TouchDragInside: UIControlEvents { get }
    static var TouchDragOutside: UIControlEvents { get }
    static var TouchDragEnter: UIControlEvents { get }
    static var TouchDragExit: UIControlEvents { get }
    static var TouchUpInside: UIControlEvents { get }
    static var TouchUpOutside: UIControlEvents { get }
    static var TouchCancel: UIControlEvents { get }

    static var ValueChanged: UIControlEvents { get } // sliders, etc.

    static var EditingDidBegin: UIControlEvents { get } // UITextField
    static var EditingChanged: UIControlEvents { get }
    static var EditingDidEnd: UIControlEvents { get }
    static var EditingDidEndOnExit: UIControlEvents { get } // 'return key' ending editing

    static var AllTouchEvents: UIControlEvents { get } // for touch events
    static var AllEditingEvents: UIControlEvents { get } // for UITextField
    static var ApplicationReserved: UIControlEvents { get } // range available for application use
    static var SystemReserved: UIControlEvents { get } // range reserved for internal framework use
    static var AllEvents: UIControlEvents { get }
}

UITextFieldは、右側の「touchUpInside」を参照しても応答しません。これは、許容可能なコントロールイベントであることがわかります。

12
Loxx

更新Swift 3

Swift 3のコードは次のとおりです。

myTextField.addTarget(self, action: #selector(myTargetFunction), for: .touchDown)

これは機能です:

func myTargetFunction() {
    print("It works!")
}
10
Ibrahim

AppleのUIControlEventsドキュメント を参照して、次のことを思いつきました。

最初にUITextFieldDelegateをクラスに追加してから、

textBox.delegate = self
textBox.addTarget(self, action: #selector(TextBoxOn(_:)),for: .editingDidBegin)
textBox.addTarget(self, action: #selector(TextBoxOff(_:)),for: .editingDidEnd)

以下の機能を備えています。

func TextBoxOff(_ textField: UITextField) {
     code
         }                
}

func TextBox(_ textField: UITextField) {
    code
         }
}
8
Craig P

Swift 3.1:

1)ジェスチャーレコグナイザーを作成します。

let textViewRecognizer = UITapGestureRecognizer()

2)認識エンジンにハンドラーを追加します。

textViewRecognizer.addTarget(self, action: #selector(tappedTextView(_:))) 

3)テキストビューに認識エンジンを追加します。

textView.addGestureRecognizer(textViewRecognizer)

4)ハンドラーをクラスに追加します。

func tappedTextView(_ sender: UITapGestureRecognizer) {
        print("detected tap!")
}
6
drbobdugan

これを少し明確にするために、これらのことを適切に行う必要があります。ユーザーが自分のクレジットtextFieldのアプリに何かを入力した場合、デビットtextFieldのすべてが削除されるようにするためにこれを使用しました。

  1. UITextFieldDelegate View Controllerで宣言する必要があります。つまり、SecondSecondController :
  2. 検出器関数func myDebitDetector func myCreditDetectorはViewControllerクラスにある必要があります。
  3. put debit.addTargetおよびcredit.addtarget内部ビューが表示されます。

  4. @ IBOutlet weak var debit:UITextField!および@ IBOutlet weak var credit:UITextField!はストーリーボード上のテキストフィールドで、viewControllerに接続されています。

    class SecondViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
    
    @IBOutlet weak var credit: UITextField!
    @IBOutlet weak var debit: UITextField!
    
        func myDebitDetector(textfield: UITextField ){
            print("using debit")
            credit.text = ""
    
        }
    
        func myCreditDetector(textfield: UITextField) {
            print("using cedit")
            debit.text = ""
        }
    
        override func viewWillAppear(animated: Bool) {
    
    
    
            debit.addTarget(self, action: "myDebitDetector:", forControlEvents: UIControlEvents.TouchDown)
            credit.addTarget(self, action: "myCreditDetector:", forControlEvents: UIControlEvents.TouchDown)
        ....
    
        }
    }
    
4
Mountain Man

Swift 3.0バージョン:

textFieldClientName.addTarget(self, action: Selector(("myTargetFunction:")), for: UIControlEvents.touchDown)
3
Matheus Faleiro

UITextFieldデリゲートをView Controllerに設定し、デリゲートメソッドを実装します

-(void)textField:(UITextField*)textField didBeginEditing {
   // User touched textField
}
1
Lytic

スウィフト4.2。

。touchDownおよびdelegateの代わりに。editingDidEndを試してください。

myTextField.addTarget(self, action: #selector(myTargetFunction), for: .editingDidEnd)

@objc func myTargetFunction(textField: UITextField) {
    print("textfield pressed")
}
0
Andy