簡體   English   中英

iOS/Swift:如何檢測 UITextField 上的觸摸動作

[英]iOS/Swift: how to detect touch action on a UITextField

我想檢測 UITextField 上的觸摸動作。

觸摸文本字段內部似乎不會觸發“Touch Up Inside”動作。

似乎沒有為UITextField啟用“Touch Up Inside”,但“Touch Down”有效。

所以解決方法如下:

斯威夫特 4.x

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

斯威夫特 3.x

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

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

Swift 4 及更高版本:

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

這是一個委托函數。

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

來自快速文檔:

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" 看右邊,你會發現它是可接受的控制事件

Swift 3 更新

這是 Swift 3 的代碼:

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

這是函數:

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

我參考了AppleUIControlEvents 文檔並提出了以下內容:

首先將 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
         }
}

對於 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!")
}

為了使這更清楚一些,這些東西需要到位。 我用它來做到這一點,如果用戶在我自己的信用textField的應用程序中輸入了一些東西,借方textField textField任何內容都會被刪除。

  1. UITextFieldDelegate需要在視圖控制器中聲明,即類 SecondViewController:
  2. 檢測器函數func myDebitDetector func myCreditDetector需要在 ViewController 類中。
  3. debit.addTarget 和 credit.addtarget放入視圖中。

  4. @IBOutlet 弱變量借記:UITextField! @IBOutlet 弱變量信用:UITextField! 是故事板上的文本字段並連接到視圖控制器。

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

將 UITextField 委托設置為您的視圖控制器

對象-C

textField.delegate = self;

迅速

textField.delegate = self

實現委托方法

對象-c

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

迅速

func textFieldDidBeginEditing(textField: UITextField!) {    //delegate method

}

斯威夫特 3.0 版本:

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

斯威夫特 4.2。

嘗試.editingDidEnd而不是.touchDowndelegate

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

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

在 xamarin.iOS 上我很容易使用:

YourTextField.WeakDelegate = this;

[...]

[Export("textFieldDidBeginEditing:")]
public void TextViewChanged(UITextField textField)
{
    if (YourTextField.Equals(textField))
        IsYourTextFileFocused = true;
}
** Swift 4.0 + **
Use custom action like this


YourTextField.addTarget(self, action: #selector(myTargetFunction(_:)), for: .allEditingEvents)

@IBAction private func myTargetFunction(_ sender: Any) {
        if let textField = sender as? UITextField {
            // get textField here
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM