【问题标题】:UITextfield uneditable fieldUITextfield 不可编辑的字段
【发布时间】:2012-11-19 15:14:37
【问题描述】:

我希望文本字段中包含不可编辑的常量文本,例如:

ENTER YOUR NAME: 

点击文本字段会在:之后获得光标

用户也不能删除或编辑“输入您的姓名:”。

我该如何实现?

【问题讨论】:

  • (抱歉。我误解了你的问题。)
  • UITextField 旁边有标签吗?在 UITextField 中包含静态文本似乎是一种糟糕的方法,因为您每次都必须对值进行子串化。

标签: objective-c ios


【解决方案1】:

将文本字段的委托设置为UITextFieldDelegate 实现的实例,并使用textField:shouldChangeCharactersInRange:replacementString: 方法查看用户是否尝试更改ENTER YOUR NAME: 字符串:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // "ENTER YOUR NAME:" occupies the first 16 characters; if the user us trying
    // to change something that is within that 16-character range, say "NO"
    if (range.location < 16) return NO;
    ... check additional conditions here
    return YES;
}

我认为没有办法直接放置光标,但您可以在初始文本的尾随冒号后进行空选择,如this answer 中所述。

【讨论】:

    【解决方案2】:

    一种解决方案是检查您的静态内容(静态文本)是否仍然存在,如果不存在,则在 shouldChangeCharactersInRange 中返回 NO。这是一个示例

    - (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
      NSRange prefixRange = [textField.text rangeOfString:@"ENTER YOUR NAME:"];
      if(suffixRange.location == NSNotFound) {
        return NO;
      }
      // Only characters in the NSCharacterSet you choose will insertable.
      NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:ALPHA] invertedSet];
      NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
      return [string isEqualToString:filtered];
    }
    

    阿尔法是 #define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

    【讨论】:

      【解决方案3】:

      我没有足够的声誉,或者我只是发表评论,但 Omar 的建议是使用 UILabel,在你的情况下会说“输入你的名字:”,然后将你的 UITextField 放在远离那个标签,你想控制光标的位置。

      为了让它看起来更好看,你可以放一些背景文本字段样式的图像(我就是这样做的),或者将 UILabel 的默认背景拉伸到所需的长度,然后确保 UITextField 的子视图位于标签的上方。

      【讨论】:

        【解决方案4】:

        我设法以一种有点棘手但简单的方式完成了它。

            UIButton *rem = [UIButton buttonWithType:UIButtonTypeCustom];
            rem.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
            rem.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
            rem.frame = CGRectMake(0.0f, 210.0f, 300.0f, 40.0f);
            [rem setTitle:@"*X1*" forState:UIControlStateNormal];      
            
            CALayer * layer1 = [rem layer];
            [layer1 setMasksToBounds:YES];
            [layer1 setCornerRadius:8.0];
            [layer1 setBorderWidth:0.0];
            [layer1 setBorderColor:[[UIColor grayColor] CGColor]];
            rem.backgroundColor = [UIColor colorWithPatternImage:image];
            rem.titleLabel.font = [UIFont systemFontOfSize:17.0f];
            rem.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
              
            textField = [[UITextField alloc] initWithFrame:CGRectMake(45.0f, 210.0f, 255.0f, 40.0f)];
            textField.backgroundColor = [UIColor clearColor];
            [_textFields addObject:textField];
            [textField setBorderStyle:(UITextBorderStyleNone)];
            textField.textColor = [UIColor whiteColor];
        
            [TableControll.view addSubview:rem];
            [TableControll.view addSubview:textField];
        

        基本上我只是创建标题为 UNEDITABLE NAME 的按钮,其大小是理想的textField 的大小。然后我使用width - size of text 创建没有样式的文本字段并将其添加到顶部。不可编辑的文本将无法选择。但我想你可以实现按钮的动作来选择文本字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多