Методы делегатов UITextField не запускаются при программном программировании

Я создал пользовательское представление ввода для ввода текста в UITextField. По сути, это просто настраиваемая цифровая клавиатура. У меня есть текстовые поля, на которых я установил свойство inputView для использования моего настраиваемого подкласса UIView. В этом представлении у меня есть набор кнопок - от 0-9, а также обратно.

Теперь я хочу программно изменить текст UITextField при нажатии этих кнопок. UITextField принимает UITextInput протокол, в котором он принимает UIKeyInput. В этом протоколе у ​​меня есть все необходимые мне методы, т.е. Вставка текста в позицию курсора и удаление текста.

Проблема заключается в том, что эти методы не запускают методы делегата UITextField. То есть, если у меня есть выборочная проверка в поле textField:shouldChangeCharactersInRange:replacementString:, например, это не сработает. Я попытался установить свойство text UITextField напрямую, но это тоже не сработало.

Каков правильный способ вставки текста в UITextField, я имею в виду текст вставки таким образом, что будут вызваны все методы делегата?

Ответ 1

Задайте текст UITextField, вызвав insertText:

aTextField.insertText(" ")

Ответ 2

Я попытался использовать textField:shouldChangeCharactersInRange:replacementString: без везения. Я продолжал сталкиваться с "неудачным селектором, отправленным в экземпляр", когда я пытался использовать этот метод.

Я также попытался поднять события редактирования, но я до сих пор не дошел до точки останова в моем переопределении параметра ShouldChangeText моего UITextFieldDelegate.

Я решил создать вспомогательный метод, который либо вызовет делегат текстового поля (если существует), либо виртуальный метод ShouldChangeCharacters; и на основе того, что возвращает true или false, затем изменит текст.

Я использую Xamarin.iOS, поэтому мой проект находится на С#, но приведенная ниже логика может быть легко переписана в Objective-C или Swift.

Можно вызвать, например:

    var replacementText = MyTextField.Text + " some more text";
MyTextField.ValidateAndSetTextProgramatically(replacementText);

Класс помощника расширения:

/// <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;
    }
}

Ответ 3

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

/* Поместите свой контроллер View Object вместо себя, когда методы делегата находятся в другом классе */

/* текстовое поле delagete вызывается, когда текст просматривает изменение */

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

В качестве этого метода вы также хотите создать собственные методы.