Я хотел бы обнаружить действие касания на UITextField.iOS/Swift: как обнаружить касание на UITextField
Похоже, что действие «Touch Up Inside» не срабатывает при касании внутри текстового поля.
Я хотел бы обнаружить действие касания на UITextField.iOS/Swift: как обнаружить касание на UITextField
Похоже, что действие «Touch Up Inside» не срабатывает при касании внутри текстового поля.
Кажется, что «Touch Up Inside» не включен для UiTextField, но «Touch Down» работает.
Таким образом, решение выглядит следующим образом:
myTextField.addTarget(self, action: #selector(myTargetFunction), for: UIControlEvents.touchDown)
@objc func myTargetFunction(textField: UITextField) {
print("myTargetFunction")
}
Установите UITextField делегат к контроллеру представления, реализовать метод делегата
-(void)textField:(UITextField*)textField didBeginEditing {
// User touched textField
}
вот 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» см с правой стороны, вы найдете это приемлемые события управления
Чтобы сделать это немного яснее, эти вещи должны быть на месте. Я использовал это, чтобы сделать так, чтобы пользователь вносил что-то в приложение своего текстового поля с кредитом. Все текстовое поле дебетования удаляется.
положить debit.addTarget и credit.addtarget Внутренний вид появится.
@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)
....
}
}
Swift 3.0 Версия:
textFieldClientName.addTarget(self, action: Selector(("myTargetFunction:")), for: UIControlEvents.touchDown)
Это не работает ... Я получаю: Значение типа 'UITextView' не имеет члена 'addTarget' – drbobdugan
Это не работает, чувак, пожалуйста, помогите :) –
обновления для Swift 3
Вот код для Swift 3:
myTextField.addTarget(self, action: #selector(myTargetFunction), for: .touchDown)
Это функция:
func myTargetFunction() {
print("It works!")
}
Для 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!")
}
Я сослался на 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
}
}
Все ответы, кроме вашего ответа, были бесполезны для меня! Только он работал отлично! Благодаря :) – Mansour
class ViewController: UIViewController, UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField == myTextField {
print("You edit myTextField")
}
}
}
Это функция делегата.
Спасибо @Lacerax, но я хотел бы обнаружить, что пользователь удаляет текстовое поле. Я уже обнаруживаю редактирование с помощью этой функции 'myTextField.addTarget (self, action:" myTargetFunction: ", forControlEvents: UIControlEvents.EditingChanged)', без необходимости UITextFieldDelegate –
, поэтому вы имеете в виду касание, но не вводите текстовое поле, не так ли? – Loxx
да, просто нажмите на текстовое поле –