UITextField的clearbutton在UITableViewCell中不起作用

时间:2012-08-12 15:43:28

标签: ios uitableview uitextfield

我有UITableView有一些单元格,我为每个单元格添加UITextField

我设置textField.clearButtonMode = UITextFieldViewModeWhileEditing

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

除了清除按钮外,所有其他工作都很顺利。

4 个答案:

答案 0 :(得分:7)

我遇到了这个问题,因为我忘记了我正在使用UITapGestureRecognizer抓住桌面上的水龙头来解除键盘,它正在捕捉清除按钮上的水龙头,阻止它运行。在cancelsTouchesInView=NO上添加UITapGestureRecognizer以使触摸仍然生效,并使用点按器方法上的CGRectContainsPoint进行检查,仅在点按未结束时检查resignFirstResponder当前UITextField的框架矩形。请注意,这仍然不完全是完美的,因为在自动更正上点击X可能在文本字段的frame rect之外,因此检查单元格的contentView会更好。

答案 1 :(得分:1)

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

此外,我建议您阅读有关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

答案 2 :(得分:1)

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

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 :(得分:0)

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

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

您应该从 iOS 2.0 开始向 contentView 添加子视图。