UITextField 的清除按钮在 UITableViewCell 中不起作用

Posted

技术标签:

【中文标题】UITextField 的清除按钮在 UITableViewCell 中不起作用【英文标题】:UITextField's clearbutton is not working in the UITableViewCell 【发布时间】:2012-08-12 15:43:27 【问题描述】:

我有一个UITableView,其中包含一些单元格,我在每个单元格中添加了一个UITextField

我设置了textField.clearButtonMode = UITextFieldViewModeWhileEditing

当我编辑 textField 时,清除按钮和键盘都出来了。我在 textField 中键入一些单词,然后点击清除按钮,键盘将被隐藏,但 textField 中的文本不会被清除。

除清除按钮外,其他所有功能都很好。

【问题讨论】:

【参考方案1】:

我遇到了这个问题,因为我忘记了我正在使用UITapGestureRecognizer 来捕捉桌面上的点击以关闭键盘,并且它正在捕捉清除按钮上的点击,从而阻止它运行。在UITapGestureRecognizer 上添加cancelsTouchesInView=NO 以使触摸仍然生效并检查使用CGRectContainsPoint on the tapper 方法仅结束编辑和resignFirstResponder 仅当点击不在当前UITextField 的框架上时矩形。请注意,这仍然不是完全完美的,因为在自动更正上点击 X 可能超出文本字段的框架矩形,因此检查单元格的 contentView 可能会更好。

【讨论】:

和你一样,我也在使用 UITapGestureRecognizer 来捕捉桌面上的水龙头。谢谢 cancelsTouchesInView=NO 应该在哪里执行?在 tap 方法中? 一个更完整的例子会很好;-) @JohanKarlsson 这是手势识别器的属性。【参考方案2】:

如果你有手势识别器,你应该这样做

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(methodThatYouMayCall)];
[myTextField addGestureRecognizer:gestureRecognizer];
gestureRecognizer.delegate =  self;
gestureRecognizer.cancelsTouchesInView = NO;

当您单击清除按钮时,这将清除文本字段并触发“methodThatYouMayCall”,因此您也应该这样做 你的 textField.clearButtonMode 是一种 UIButton 类,所以你可以这样做

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
   
   if ([touch.view isKindOfClass:[UIButton class]]) 
   
       return NO;
   
   else
   
       return YES;
   

不要忘记将类标记为实现 UIGestureRecognizerDelegate 协议。 希望这会对你有所帮助。

【讨论】:

【参考方案3】:

我无法重现您遇到的问题,因为触摸“清除”按钮不会也不应该让第一响应者辞职。但也许您可以将您的代码与我在下面包含的最基本用例进行比较,以找出问题所在。

此外,我建议您阅读有关 UIResponder 的文档,因为您似乎可能不小心涉足该领域。

@implementation TextFieldTableViewController

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    // Return the number of rows in the section.
    return 5;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    // Remove old instances of myTextField
    for (UIView *oldView in cell.contentView.subviews)
        [oldView removeFromSuperview];

    // Create my new text field
    UITextField *myTextField = [[UITextField alloc] initWithFrame:cell.contentView.bounds];
    [myTextField setClearButtonMode:UITextFieldViewModeWhileEditing];
    [myTextField setBorderStyle:UITextBorderStyleRoundedRect];

    // Add the TextField to the content view
    [cell.contentView addSubview:myTextField];

    return cell;


@end

【讨论】:

【参考方案4】:

虽然最初的问题不是由此引起的,但我认为任何未来的搜索都可能需要知道:

您添加到UITableViewCell 的视图必须作为子视图添加到其contentView 属性,否则您可能会遇到在未启用用户交互的情况下显示的视图。

ios 2.0 起,您应该将子视图添加到 contentView

【讨论】:

以上是关于UITextField 的清除按钮在 UITableViewCell 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITextField 清除按钮

UITextField在开始编辑时具有“清除”按钮大小

在 UITextfield 中定位“清除按钮”

UITextField 清除按钮调用 didEndEditing 两次

UITextField 的清除按钮在 UITableViewCell 中不起作用

UITextField 清除按钮与屏幕动画一起使用