我创建了一个自定义输入视图,用于将文本输入UITextField
。基本上它只是定制设计的数字键盘。我有textfields,我在其上设置了inputView属性以使用我自定义创建的UIView
子类。在那个视图中,我有一些按钮 - 从0-9到退格。
现在我想在点击这些按钮时以编程方式更改UITextField的文本。 UITextField
采用UITextInput
协议,后者采用UIKeyInput
协议。在该协议中,我拥有我需要的所有方法,即将文本插入光标位置并删除文本。
问题是这些方法不会触发UITextField
委托方法。也就是说,如果我在textField:shouldChangeCharactersInRange:replacementString:
字段中进行自定义验证,那将无效。我试图直接设置UITextField
的文本属性,但这也不起作用。
将文本插入UITextField
的正确方法是什么,我的意思是以调用所有委托方法的方式插入文本?
答案 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
}
}
与此方法相同,您也想制作自定义方法。