Ответ 1
Задайте текст UITextField, вызвав insertText:
aTextField.insertText(" ")
Я создал пользовательское представление ввода для ввода текста в UITextField
. По сути, это просто настраиваемая цифровая клавиатура. У меня есть текстовые поля, на которых я установил свойство inputView для использования моего настраиваемого подкласса UIView
. В этом представлении у меня есть набор кнопок - от 0-9, а также обратно.
Теперь я хочу программно изменить текст UITextField при нажатии этих кнопок. UITextField
принимает UITextInput
протокол, в котором он принимает UIKeyInput
. В этом протоколе у меня есть все необходимые мне методы, т.е. Вставка текста в позицию курсора и удаление текста.
Проблема заключается в том, что эти методы не запускают методы делегата UITextField
. То есть, если у меня есть выборочная проверка в поле textField:shouldChangeCharactersInRange:replacementString:
, например, это не сработает. Я попытался установить свойство text UITextField
напрямую, но это тоже не сработало.
Каков правильный способ вставки текста в UITextField
, я имею в виду текст вставки таким образом, что будут вызваны все методы делегата?
Задайте текст UITextField, вызвав insertText:
aTextField.insertText(" ")
Я попытался использовать 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;
}
}
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
}
}
В качестве этого метода вы также хотите создать собственные методы.