UITextField上的第二次点击(在UITableViewCell子类中)意外地解除了键盘

时间:2012-04-09 13:30:17

标签: ios uitableview uitextfield

我正在实现一个UITableView,它包含一些自定义的UITableViewCells,每个都包含UITextField。

与大多数想要键盘在某些事件中消失的人不同,我希望它一直出现。 问题是第一次点击UITextField会触发键盘显示没有任何问题。但是一旦我再次点击它,当前出现的键盘现在就消失了。

此外,另一个相关问题是我无法在UITextField中更改光标的位置。 一旦我在UITextField上按住水龙头以更改光标的当前位置,放大镜就会按预期弹出。但是一旦我放开水龙头,键盘就会立即关闭。

如何解决这个问题?

- (void)viewDidLoad
{
    ...
    TagDetailCell *cell1 = [[[NSBundle mainBundle] loadNibNamed:@"TagDetailCellView" owner:self options:nil] lastObject];
    TagDetailCell *cell2 = [[[NSBundle mainBundle] loadNibNamed:@"TagDetailCellView" owner:self options:nil] lastObject];
    TagDetailCell *cell3 = [[[NSBundle mainBundle] loadNibNamed:@"TagDetailCellView" owner:self options:nil] lastObject]; 
    self.cells=[NSArray arrayWithObjects:cell1, cell2, cell3, nil];
    ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[self.cells objectAtIndex:indexPath.row];
    cell.selectionStyle=UITableViewCellSelectionStyleNone;

    switch (indexPath.row) {
        ...
        ((TagDetailCell*)cell).fieldLabel.text= ...;
        ((TagDetailCell*)cell).fieldValue.clearButtonMode=UITextFieldViewModeWhileEditing;
        ((TagDetailCell*)cell).fieldValue.text=...;
        [((TagDetailCell*)cell).fieldValue addTarget:self action:@selector(textFieldChanged:) forControlEvents:UIControlEventEditingChanged];
        ...
    }
    return cell;

}

我没有实现UITextField的任何委托。我应该吗?

2 个答案:

答案 0 :(得分:1)

我是傻瓜。我将UITextField子类化并覆盖以下方法以防止用户复制/粘贴文本:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender    
{    
    [UIMenuController sharedMenuController].menuVisible = NO;  //do not display the menu
    [self resignFirstResponder];                      //do not allow the user to selected anything
    return NO;
}

键盘解雇的问题来自于[self resignFirstResponder]的召唤。因此,删除它可以解决问题。

答案 1 :(得分:0)

查看文档中的UIViewController方法disablesAutomaticKeyboardDismissal 引用Apple文档:

  

在子类中重写此方法以允许或禁止解雇   更改时的当前输入视图(通常是系统键盘)   从想要输入视图的控件到不需要输入视图的控件。下   正常情况下,当用户点击需要的控件时   在输入视图中,系统自动显示该视图。攻击一个   不希望输入视图的控件随后导致   当前输入视图将被解除,但可能并非在所有情况下都被忽略。您可以   在那些未完成的情况下覆盖此方法以允许输入   视图被解雇或使用此方法来阻止视图   在其他情况下被驳回。