【问题标题】:iOS UITextField not clearing when editing编辑时iOS UITextField未清除
【发布时间】:2012-12-19 23:57:01
【问题描述】:

我有一个标准的 UITextField,已添加到 UITableViewCell 中,每当我去编辑它时,其中的文本都不会清除。我试过放置一个占位符,编辑时也不会清除。怎么回事?

if (indexPath.row == 1) {
        cell.textLabel.text = @"Device ID";
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        deviceID = [[UITextField alloc] initWithFrame:CGRectMake(115, 11, 388, 22)];
        deviceID.delegate = self;
        deviceID.adjustsFontSizeToFitWidth = YES;
        deviceID.font = [UIFont boldSystemFontOfSize:15];
        deviceID.textColor = [UIColor blackColor];
        deviceID.autocorrectionType = UITextAutocorrectionTypeNo;
        deviceID.autocapitalizationType = UITextAutocapitalizationTypeNone;
        deviceID.textAlignment = NSTextAlignmentLeft;
        deviceID.clearButtonMode = UITextFieldViewModeWhileEditing;
        deviceID.keyboardType = UIKeyboardTypeDefault;
        deviceID.backgroundColor = [UIColor clearColor];
        deviceID.delegate = self;
        deviceID.clearsOnBeginEditing = YES;
        deviceID.text = [[NSUserDefaults standardUserDefaults] objectForKey:DEVICE_ID];
        [deviceID setEnabled:YES];
        [cell addSubview:deviceID];
    }

- (BOOL)textFieldShouldClear:(UITextField *)textField {

    return YES;
}

【问题讨论】:

  • 您的界面中是否包含UITextFieldDelegate 协议?

标签: ios uitableview uitextfield textfield placeholder


【解决方案1】:

每当调用cellForRowAtIndexPath 时,您都会将相同文本字段的多个实例添加到单元格中。在viewDidLoad 中创建文本字段并添加到此单元格中。它应该工作。

另一种方法是将您的UITableViewCell 子类化,并在其init 方法中添加此textFiled 作为其属性。然后你可以将值设置为cell.textField.text = @"some value";

如果在cellForRowAtIndexPath中添加这一行,

deviceID = [[UITextField alloc] initWithFrame:CGRectMake(115, 11, 388, 22)];

每当重新加载表格视图时都会调用它,并且您将丢失以前文本字段的引用。因此,您需要确保只创建一个文本字段并将其添加到 tableview 单元格。这也将确保您在单元格中只创建了一个文本字段。

【讨论】:

  • 啊,这就是原因。谢谢我没想到。谢谢。
  • 所以我可能应该只继承一个 UITableViewCell?
  • @JonErickson,是的,在这种情况下更好。现在检查我的答案。我已根据该建议进行了编辑。如果你在tableview cell的init方法的子类中创建这个textfield,你可以使用cell.textField.text = @"some value";设置值,cell.textField.hidden = YES;隐藏在cellForRowAtIndexPath方法中。
  • 问题不在于委托方法不起作用,它正在起作用,而是每次刷新 UITableView 和每次tableview 被重新加载,指向 UITextField 的指针丢失了,这就是为什么我必须继承一个 UITableViewCell。
  • @iProgrammed,你投反对票了吗?问题不在于委托方法不起作用。只是多个文本字段被添加到其他文本字段之上,这给人一种以前的文本不可编辑的感觉。它与委托方法无关。
【解决方案2】:

如果你试试这个委托方法会怎样:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
   [textField setText:@""];
}

【讨论】:

  • 看上面的答案,这是因为每次重新加载表格时,它都会重新添加子视图,从而在彼此之上创建 UITextField 的堆栈。我需要继承一个 UITableViewCell 来实现这一点。
【解决方案3】:

我在另一篇文章中发现了以下内容(通常与视图有关):

[self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

并转换为:

[cell.contentView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

完美解决此线程中的问题。

【讨论】:

    【解决方案4】:

    你可以用这个

    [deviceID removeFromSuperview];
    devideID = nil;
    deviceID = [[UITextField alloc] initWithFrame:CGRectMake(115, 11, 388, 22)];
    ...
    

    虽然接受的答案有效,但如果您不想将必须创建 UITextField 的责任委托给 ViewController,请使用此

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多