以编程方式设置文本时不会触发UITextField委托方法

时间:2014-07-15 08:49:35

标签: ios objective-c uitextfield uitextfielddelegate

我创建了一个自定义输入视图,用于将文本输入UITextField。基本上它只是定制设计的数字键盘。我有textfields,我在其上设置了inputView属性以使用我自定义创建的UIView子类。在那个视图中,我有一些按钮 - 从0-9到退格。

现在我想在点击这些按钮时以编程方式更改UITextField的文本。 UITextField采用UITextInput协议,后者采用UIKeyInput协议。在该协议中,我拥有我需要的所有方法,即将文本插入光标位置并删除文本。

问题是这些方法不会触发UITextField委托方法。也就是说,如果我在textField:shouldChangeCharactersInRange:replacementString:字段中进行自定义验证,那将无效。我试图直接设置UITextField的文本属性,但这也不起作用。

将文本插入UITextField的正确方法是什么,我的意思是以调用所有委托方法的方式插入文本?

3 个答案:

答案 0 :(得分:4)

通过调用insertText:

设置UITextField的文本
aTextField.insertText(" ")

答案 1 :(得分:1)

我没有运气就尝试使用textField:shouldChangeCharactersInRange:replacementString:。我一直遇到一个"错误的选择器发送到实例"我尝试调用该方法时崩溃。

我也尝试过提高编辑事件,但我仍然没有在我的UITextFieldDelegate的ShouldChangeText覆盖中到达断点。

我决定创建一个帮助方法,它可以调用文本字段的委托(如果存在)或虚拟的ShouldChangeCharacters方法;并根据返回true或false,然后将更改文本。

我使用的是Xamarin.iOS,所以我的项目是在C#中,但下面的逻辑很容易在Objective-C或Swift中重写。

可以像:

一样调用
    var replacementText = MyTextField.Text + " some more text";
MyTextField.ValidateAndSetTextProgramatically(replacementText);

Extension Helper Class:

/// <summary>
/// A place for UITextField Extensions and helper methods. 
/// </summary>
public static class UITextFieldExtensions
{
    /// <summary>
    /// Sets the text programatically but still validates
    /// When setting the text property of a text field programatically (in code), it bypasses all of the Editing events. 
    /// Set the text with this to use the built-in validation.
    /// </summary>
    /// <param name="textField">The textField you are Setting/Validating</param>
    /// <param name="replacementText">The replacement text you are attempting to input. If your current Text is "Cat" and you entered "s", your replacement text should be "Cats"</param>
    /// <returns></returns>
    public static bool ValidateAndSetTextProgramatically(this UITextField textField, string replacementText)
    {
        // check for existing delegate first. Delegate should override UITextField virtuals
        // if delegate is not found, safe to use UITextField virtual
        var shouldChangeText = textField.Delegate?.ShouldChangeCharacters(textField, new NSRange(0, textField.Text.Length), replacementText)
                               ?? textField.ShouldChangeCharacters(textField, new NSRange(0, textField.Text.Length), replacementText);
        if (!shouldChangeText)
            return false;

        //safe to update if we've reached this far
        textField.Text = replacementText;
        return true;
    }
}

答案 2 :(得分:0)

self.textfield.delegate = self;
    [self.textfield addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

/ *当委托方法在另一个类* /

中时,将View控制器对象改为self

/ * textfield delagete在文本查看更改时调用* /

-(void)textFieldDidChange:(UITextField *)textView
{
    if(Condition You want to put)
    {
        //Code
    }
    else
    {
        //Code
    }
}

与此方法相同,您也想制作自定义方法。