【问题标题】:iOS UITextField changes position when text is changediOS UITextField 在文本更改时更改位置
【发布时间】:2012-12-04 18:32:28
【问题描述】:

我使用它来将文本字段置于相关内容的中心:

[textField setCenter:[someObject center]];
[textField becomeFirstResponder];

这看起来很棒,很好,并且以对象为中心,准备好接受文本。我希望文本以某种方式格式化,因此在编辑更改处理程序中,我修改文本并设置为新文本:

[textField setText:newText];

当我这样做时,文本字段将从居中之前跳转到它的旧位置。我希望文本字段保持在对象的中心。

我的经验是,可能有更好的方法来做到这一点,即移动文本字段并动态更改其内容,而不必解决各种怪癖。有什么建议吗?

【问题讨论】:

  • 只是一个想法,但您使用的是自动布局吗?如果是这样,请尝试将其关闭并查看错误是否仍然存在。
  • 有没有办法只为控件关闭自动布局?
  • 不,这是每个xib文件的设置。
  • 好的,我找到了一个使用 replaceRange:withText: 和 UITextPosition 和 UITextRange 类的解决方案,并将其设置为第一响应者,并且梨树中的某处可能也有一只鹧鸪。
  • 关闭自动布局对我有用。谢谢@AmyWorrall。

标签: ios uitextfield


【解决方案1】:

要在编辑时格式化 UITextField,您可以尝试以下代码。

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    if([string isEqualToString:@"4"]){
        UITextRange *range=textField.selectedTextRange;
        [textField replaceRange:range withText:@"Hi"];
        return NO;
    }
    return YES;
}

我保持 UITextfield 居中对齐。当它在开始、中心或任何位置检测到“4”时,它将用“Hi”替换它,同时保持它的中心对齐行为。

【讨论】:

  • 使用 setText 确认:它仍然会移动文本字段。它可能适用于replaceRange,但我需要完全更改文本,而不仅仅是替换范围。仔细研究一下,这似乎是难以置信的困难:没有简单的方法来创建包含整个字符串的 UITextRange,需要继承两个类 UITextRange 和 UITextPosition,textField 需要是第一响应者。即使我做了所有这些,我仍然不知道文本字段是否会移动。
【解决方案2】:

除了上面的代码,用下面的代码替换了已有的文字:

UITextPosition *p0 = [textField beginningOfDocument];
UITextPosition *p1 = [textField positionFromPosition:p0 offset:[[textField text] length]];
UITextRange *complete = [textField textRangeFromPosition:p0 toPosition:p1];
[textField replaceRange:complete withText:newText];

对于本应轻松完成的任务的可怕解决方案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 2010-11-23
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2011-08-09
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多