Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 点击UITextField不工作_Ios_Objective C_Iphone_Swift_Swift3 - Fatal编程技术网

Ios 点击UITextField不工作

Ios 点击UITextField不工作,ios,objective-c,iphone,swift,swift3,Ios,Objective C,Iphone,Swift,Swift3,我读了很多书,试图找到一种处理uitextfield单击的方法,但对我来说没有任何效果 我想要的是: 我想在UITextField上添加点击并打开对话框 我尝试的是: class CreateMessagesViewController: UIViewController { @IBOutlet weak var testField: UITextField! @IBOutlet weak var testView: UIView! override func vie

我读了很多书,试图找到一种处理uitextfield单击的方法,但对我来说没有任何效果

我想要的是:

我想在UITextField上添加点击并打开对话框

我尝试的是:

class CreateMessagesViewController: UIViewController {

    @IBOutlet weak var testField: UITextField!
    @IBOutlet weak var testView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
//        testField.addGestureRecognizer(tap)
        testView.addGestureRecognizer(tap)

        testField.addTarget(self, action: #selector(onTapped(_:)), for: .touchDown)
    }

    func onTapped(_ sender : UITextField){

        print("Hello World")
    }

    func handleTap(_ sender: UITapGestureRecognizer) {
        print("Hello World")
    }
}
如您所见,我尝试了两种方法:

  • UITAPPgestureRecognitor
  • 选择器
  • 为了进行测试,我添加了简单的UIView,以确保tap正常工作,并且正常工作


    为什么它在uiTextField上不起作用?我错过了什么吗?

    不可能。因为Textfield委托方法调用

    将手势识别器添加到
    UITextField
    superview,并检查是否有帮助:

    testField.superview.addGestureRecognizer(tap)
    

    您可以在中编写打开对话框的代码,而不是添加手势识别器

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool{
        openDialog()//Function which will open the dialog
        return false
    }
    

    我认为它应该具有与您想要的相同的效果。

    我为您的问题创建了一个示例,包括Swift和Objective C,但它不起作用。我使用了文本字段的点击手势识别器代码,但它甚至没有调用

    未在Swift和Objective C中的代码下工作

    Swift

    let tap = UITapGestureRecognizer(target: self,action: #selector(handleTaponTextField(_:)))
    tap.numberOfTapsRequired = 1
    tap.delegate = self
    txtFldTapMe.isUserInteractionEnabled = true
    txtFldTapMe.addGestureRecognizer(tap)
    
    func handleTaponTextField(_ sender: UITapGestureRecognizer)
    {
        print("Tap is handled here!")
    }
    
    txtFldTapMe.addTarget(self, action: #selector(textFieldEditDidBegin(_:)), for: .editingDidBegin)
    
    func textFieldEditDidBegin(_ textField: UITextField) {
        print("Text editing begin here!")
    }
    
    目标C

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tapGesture.numberOfTapsRequired = 1;
    tapGesture.delegate = self;
    txtfldTapME.userInteractionEnabled = YES;
    [txtfldTapME addGestureRecognizer:tapGesture];
    
    func handleTaponTextField(_ sender: UITapGestureRecognizer)
    {
        print("Tap is handled here!")
    }
    
    [txtfldTapME addTarget:self action:@selector(editingDidBeginStarted:) forControlEvents: UIControlEventEditingDidBegin];   
    
    -(void)editingDidBeginStarted:(UITapGestureRecognizer *)sender{
      NSLog(@"Editing started here");
    }
    
    然后我尝试了textField下面的addTarget操作方法,效果很好

    在Swift和Objective C代码下工作

    Swift

    let tap = UITapGestureRecognizer(target: self,action: #selector(handleTaponTextField(_:)))
    tap.numberOfTapsRequired = 1
    tap.delegate = self
    txtFldTapMe.isUserInteractionEnabled = true
    txtFldTapMe.addGestureRecognizer(tap)
    
    func handleTaponTextField(_ sender: UITapGestureRecognizer)
    {
        print("Tap is handled here!")
    }
    
    txtFldTapMe.addTarget(self, action: #selector(textFieldEditDidBegin(_:)), for: .editingDidBegin)
    
    func textFieldEditDidBegin(_ textField: UITextField) {
        print("Text editing begin here!")
    }
    
    参见方法

    您应该使用上述textField方法

    目标C

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tapGesture.numberOfTapsRequired = 1;
    tapGesture.delegate = self;
    txtfldTapME.userInteractionEnabled = YES;
    [txtfldTapME addGestureRecognizer:tapGesture];
    
    func handleTaponTextField(_ sender: UITapGestureRecognizer)
    {
        print("Tap is handled here!")
    }
    
    [txtfldTapME addTarget:self action:@selector(editingDidBeginStarted:) forControlEvents: UIControlEventEditingDidBegin];   
    
    -(void)editingDidBeginStarted:(UITapGestureRecognizer *)sender{
      NSLog(@"Editing started here");
    }
    
    请参阅下面的textField方法

    1)添加手势识别器:

    let tapGR = UITapGestureRecognizer(target: self, action: #selector(someFunc))
    tapGR.delegate = self
    textField.addGestureRecognizer(tapGR)
    
    2) 确保在必要时允许您的点击处理程序:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true //or add your custom check here if you need
    }
    

    如果没有第二部分,你会得到一个错误的
    textField
    ,有时候点击手势不起作用,有时候默认手势不被处理

    有一种更简单的方法来实现这一点。您应该将视图控制器类确认为
    UITextFieldDelegate
    ,并在类中实现
    textfieldDiBeginediting

    func textFieldDidBeginEditing(_ textField: UITextField){
           //show popup here
    }
    
    如果有多个文本字段,请在情节提要(或代码)中为文本字段指定一个标记以识别文本字段

     func textFieldDidBeginEditing(_ textField: UITextField){
    
    // check your tag here
       if textField.tag == 0{
    
                //show your popup here
            }
    
    }
    
    试试下面的代码

    yourTextField.addTarget(self, action: #selector(didChangeText), for: .editingChanged)
        addSubview(view)
    
    @objc func didChangeText(textField:UITextField) {
        let str = textField.text
            //your functionality here
    }
    

    可能重复的可能重复的尝试禁用文本字段的选择。或者在不使用手势的情况下,apple将提供didBeginEditing委托方法。为什么不使用textfield委托方法的可能重复项,并检查此textfield然后打开对话框SuperView是否不是此处的解决方案。链接按我所需工作。您的
    点击.delegate=self
    做什么?似乎由于您遗漏了某些内容,
    UITapGestureRecognitor
    无法正常工作。