2015-08-27 7 views

ответ

29

Кажется, что «Touch Up Inside» не включен для UiTextField, но «Touch Down» работает.

Таким образом, решение выглядит следующим образом:

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

@objc func myTargetFunction(textField: UITextField) { 
    print("myTargetFunction") 
} 
1

Установите UITextField делегат к контроллеру представления, реализовать метод делегата

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

вот Swfit:

и вам не нужно использовать «touchUpInside» просто использовать методы делегата, как так :

Сделайте ваш взгляд контроллер делегата:

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

из быстрого 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» см с правой стороны, вы найдете это приемлемые события управления

+0

Спасибо @Lacerax, но я хотел бы обнаружить, что пользователь удаляет текстовое поле. Я уже обнаруживаю редактирование с помощью этой функции 'myTextField.addTarget (self, action:" myTargetFunction: ", forControlEvents: UIControlEvents.EditingChanged)', без необходимости UITextFieldDelegate –

+0

, поэтому вы имеете в виду касание, но не вводите текстовое поле, не так ли? – Loxx

+0

да, просто нажмите на текстовое поле –

3

Чтобы сделать это немного яснее, эти вещи должны быть на месте. Я использовал это, чтобы сделать так, чтобы пользователь вносил что-то в приложение своего текстового поля с кредитом. Все текстовое поле дебетования удаляется.

  1. UITextFieldDelegate потребности быть объявлены в контроллере Посмотреть т.е. класса SecondViewController:
  2. Функции, детектор Func Func myDebitDetector myCreditDetector должны быть в классе ViewController.
  3. положить debit.addTarget и credit.addtarget Внутренний вид появится.

  4. @IBOutlet weak var debit: UITextField! и @IBOutlet слабый вар кредит: UITextField! - текстовые поля на раскадровке и подключены к viewController.

    класс 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

Swift 3.0 Версия:

textFieldClientName.addTarget(self, action: Selector(("myTargetFunction:")), for: UIControlEvents.touchDown) 
+0

Это не работает ... Я получаю: Значение типа 'UITextView' не имеет члена 'addTarget' – drbobdugan

+0

Это не работает, чувак, пожалуйста, помогите :) –

7

обновления для Swift 3

Вот код для Swift 3:

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

Это функция:

func myTargetFunction() { 
    print("It works!") 
} 
3

Для 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!") 
} 
5

Я сослался на UIControlEvents documentation from Apple и придумал следующие:

Сначала добавьте 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 
     } 
} 
+0

Все ответы, кроме вашего ответа, были бесполезны для меня! Только он работал отлично! Благодаря :) – Mansour

7

Свифта 4:

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

Это функция делегата.

Смежные вопросы