it-swarm.com.de

iOS/Swift: Erkennen von Berührungsaktionen auf einem UITextField

Ich möchte die Berührungsaktion auf einem UITextField erkennen.

Es scheint, dass die Aktion "Innen ausbessern" nicht durch Berühren innerhalb des Textfelds ausgelöst wird.

22
Daniele B

Es scheint, dass "Touch Up Inside" für UiTextField nicht aktiviert ist, aber "Touch Down" funktioniert.

Die Lösung lautet also:

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

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

Schnell 4:

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

Dies ist eine Delegatfunktion.

19

hier ist Swfit:

und Sie brauchen "touchUpInside" nicht zu verwenden, verwenden Sie einfach die Delegat-Methoden wie folgt:

Machen Sie aus Ihrem View-Controller einen Delegierten:

class ViewController: UIViewController, UITextFieldDelegate{

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

Hier sind die anderen Delegatmethoden:

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.
}

von 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 reagiert nicht auf die "touchUpInside" -Seite auf der rechten Seite. Es werden akzeptable Steuerungsereignisse angezeigt

11
Loxx

Update für Swift 3

Hier ist der Code für Swift 3:

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

Dies ist die Funktion:

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

Ich bezog mich auf die UIControlEvents-Dokumentation von Apple und kam zu folgenden Ergebnissen:

Fügen Sie zuerst UITextFieldDelegate zu Ihrer Klasse hinzu, dann

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

mit folgenden Funktionen:

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

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

Für Swift 3.1:

1) Erstellen Sie eine Gestenerkennung:

let textViewRecognizer = UITapGestureRecognizer()

2) Fügen Sie dem Erkennungsprogramm einen Handler hinzu:

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

3) Fügen Sie den Erkenner zu Ihrer Textansicht hinzu:

textView.addGestureRecognizer(textViewRecognizer)

4) Fügen Sie den Handler Ihrer Klasse hinzu:

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

Swift 3.0 Version:

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

Um dies etwas klarer zu machen, müssen diese Dinge vorhanden sein. Ich habe dies verwendet, um es so zu machen, dass ein Benutzer etwas in das Textfeld meines eigenen Guthabens in einer App eingibt, das in einer App etwas eingegeben hat.

  1. UITextFieldDelegate muss im View-Controller deklariert werden, d. H. Class SecondViewController: 
  2. Die Detektorfunktionen func myDebitDetector func myCreditDetector müssen in der ViewController-Klasse sein.
  3. setze debit.addTarget und credit.addtarget in der Ansicht.

  4. @IBOutlet schwaches Var-Debit: UITextField! Und @IBOutlet schwaches Var-Credit: UITextField! Sind Textfelder im Storyboard und mit dem viewController verbunden.

    klasse 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)
        ....
    
        }
    }
    
3
Mountain Man

Setzen Sie den UITextField-Delegaten auf Ihren View-Controller, implementieren Sie die Delegat-Methode

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

Schnell 4.2. 

Versuchen Sie .editingDidEnd anstelle von .touchDown und Delegate .

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

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