【问题标题】:clearing a UITextField when the user starts typing当用户开始输入时清除 UITextField
【发布时间】:2012-11-16 13:22:36
【问题描述】:

短版:如何让 UITextField 框删除用户第一次按键时的所有内容?在用户开始输入内容之前,我不希望删除信息。即,在开始编辑时清除它是不够的。

长版:我有三个循环的 UITextField(使用返回键并在“shouldReturn”方法中捕捉按下。UITextField 中已经有文本,如果用户没有t 键入任何内容,然后转到下一个 UITextField,该值应保持不变(默认行为)。

但我希望如果用户开始输入,它会首先自动清除文本。像突出显示整个字段,然后键入任何内容会删除字段,然后添加用户按键。

“编辑开始时清除”不好,因为文本在出现在字段中的光标处立即被清除。这是不希望的。我以为我可以在这里使用占位符,但这不能作为默认值,而且我找不到默认值属性。 Highlighted 和 Selected 属性在这方面也不做任何事情。

【问题讨论】:

  • +1 解释清楚的问题

标签: ios textfield default


【解决方案1】:

在您的.h 文件中声明一个BOOL 变量,例如。

BOOL clearField;

并实现如下委托方法:

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
   clearField = YES;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
  clearField = NO;
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
  clearField = NO;
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
  if(clearField)
  {
     textField.text = @""
     clearField = NO;
  }
}

【讨论】:

  • 好的,我刚试过这个,它几乎完全适合我的情况。如果我开始输入,该字段将被清除并填充我的文本 - 好。但是如果我使用键盘上的“NEXT”按钮并在 ShouldRturn 方法中捕获它,它不会清除第二个字段。
  • 好的,解决了。我有下面的 clearField 分配下一个响应者(在设置后基本上清除了它)。
  • - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 不返回 BOOL?
  • @abbood:是的,它肯定会返回一个布尔值。我只是回答了他的问题,编写整个代码不是我的工作。如果他复制粘贴这段代码,他的编译器会告诉他,他需要在其中添加什么
【解决方案2】:

有一个委托方法叫做

textFieldDidBeginEditing:(UITextField*) tf{
  tf.startedEdinting = YES;
}

textFeildDidEndEditing: (UITextField*) tf {
  tf.startedEditing = NO;
}

将类别中的 startEditing 添加到 UITextField。

然后如果值改变清除该字段:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
 if (textField.startEditing){
  textField.text = string;
 } else {
  textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];
 }
}

您可以通过以下方式将属性添加到 UITextField 类别:

.h

@property (nonatomic, assign) BOOL startEditing;

.m

@dynamic startEditing;

- (void) setStartEditing:(BOOL)startEditing_in{ 
NSNumber* num = [NSNumber numberWithBool:startEditing_in]; 
objc_setAssociatedObject(self, myConstant, num, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
- (BOOL) startEditing{ 
NSNumber* num = objc_getAssociatedObject(self, myConstant); 
return [num boolValue]; 
}

【讨论】:

  • 就类别而言,什么是“startEditing”?我认为它不能是一个属性,因为它们不允许在类别中。但如果它是一种方法,我如何定义一个供 getter 和 setter 使用的变量?我确实了解类别的基本前提,只是不确定如何在类别的两种方法之间使用变量。
  • 戴夫,如果您能帮我实现这一点,我将不胜感激。我昨晚尝试过这样做,但我陷入了如何实现我自己的可以跨多种方法共享的属性上(顺便说一句,我没有给你-1,我实际上喜欢你的方法)
  • 您不能使用这种方法。类别不能添加实例变量或属性,只能添加方法。无法将startedEditing 添加到UITextField
  • 不这么认为,嗯嗯嗯..我正在研究子类化方法,但我被卡住了。我会到达那里。谢谢
  • @Dave 您无法将基于 ivar 的属性添加到类别中。此解决方案无法按指示完成。
【解决方案3】:

我要感谢人们的回答,我实现了这里描述的两种主要方法,并且都完美无缺。但后来我遇到了一个更简单、更好的答案,并且只涉及一行代码:)

在textField的didBeginEditing方法中,放置[self.textField selectAll:self];[self.textField selectAll:nil];

我找到的原始答案是selectAll:self,但这显示了剪切/复制/粘贴菜单。如果您发送nil 而不是self,则不会出现菜单。

添加这一行代码会在输入 textField 时突出显示文本(因此给用户一个视觉提示),并且只有在按下某个键后才会删除所有内容。

【讨论】:

    【解决方案4】:

    实现相同目的的另一种解决方案是简单地使用文本字段placeholder,其定义为:

    The string that is displayed when there is no other text in the text field.

    所以一旦用户开始输入,占位符文本就会消失。

    您可以从情节提要或programmatically 中设置。 (是的,我花了两个小时试图以更难的方式解决它。当解决方案实际上是代码的一行更改时)。

    【讨论】:

    • G'day Abbood,感谢您的建议。我确实想到了这一点,但这并没有真正奏效。问题在于它在外观上完全符合我的要求(嗯,几乎)。这样做的根本问题是,如果用户最终没有在文本字段中输入内容,则返回“无”。我意识到这可以通过编程方式解决,但我追求的是更优雅的解决方案。如果占位符可以用作“默认”的排序方式。
    • 很公平..但我认为这个答案将与您的问题相关(尤其是简短版本)..让我们这样说:对于 uitext 和 text 完全陌生的人在 iOS 中进行控制,并在谷歌上搜索与您的问题标题类似的内容.. 他们将登陆此页面.. 此页面上没有提及占位符.. 当它显然是对一些与您没有完全相同需求的人的答案时( Mindhun 的answer 可能已经解决了你的问题.. 但它没有解决我的问题)..
    • .. 所以我认为placeholder 至少值得一提.. 别担心,我不是要求投票或任何东西.. 我只是想写一些可以拯救某人的东西其他一些宝贵的时间
    【解决方案5】:

    如果您想清除用户与之交互的文本,界面构建器中有一个选项,您可以在其中将文本字段设置为“开始编辑时清除”。

    【讨论】:

      【解决方案6】:

      尝试使用以下方法。

      - (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {  
        if(isFirsttime==YES)
      {
      textfield.text==@"";
      isFirsttime=NO;
      }
      return YES;
           }
      

      【讨论】:

      • 然后您可以将 BOOL isFirsttime 设置为 YES 并在第一次单击后将其设为 NO 并使用上面的代码(已编辑)。
      • 你在哪里声明/初始化了“isFirttime”?你在什么时候将其设置为 YES?
      • .h file 中您可以声明BOOL isFirsttime 并在ViewdidLoad 将其设置为YES 在您的textfieldshouldreturn 方法中再次设置它YES
      【解决方案7】:

      为你的 textField 的初始文本声明并初始化一个 NSString 变量

      NSString *initialText=@"initial text";
      

      然后实现方法:

          -(void)textFieldDidBeginEditing:(UITextField *)textField
       {
          if(textField.text isEqualToString:initialText)
               { 
                 textField.text=@"";
              }
         }
      
      -(void)textFieldDidEndEditing:(UITextField *)textField
      {
          if(textField.text isEqualToString:@"")
          {
              textField.text=initialText;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-27
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 2011-02-02
        相关资源
        最近更新 更多