2012-04-09 3 views
0

Я реализую UITableView, который содержит несколько пользовательских UITableViewCells, каждый из которых содержит UITextField.Второе нажатие на UITextField (в подклассе UITableViewCell) неожиданно отклоняет клавиатуру

В отличие от большинства людей, которые хотят, чтобы клавиатура исчезла при некоторых событиях, я хочу, чтобы она появлялась все время. Проблема в том, что первый щелчок на 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. Нужно ли мне?

ответ

1

Я был глуп. I подкласса 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; 
} 

Проблема клавиатуры Dismissing пришла от вызова [self resignFirstResponder]. Поэтому устранение этой проблемы решает проблему.

0

Ознакомьтесь с методом UIViewControllerdisablesAutomaticKeyboardDismissal в документации.
Цитируется для Apple, документы:

Override этот метод в подклассе, чтобы разрешить или запретить увольнение текущего вида входного сигнала (обычно система клавиатуры) при изменении от элемента управления, который хочет вид входного сигнала на один это не. При нормальных обстоятельствах, когда пользователь отбирает элемент управления, которому требуется вид ввода , система автоматически отображает это представление. Нажатие в элементе управления , который не хочет, чтобы представление ввода впоследствии приводило к отклонению текущего представления ввода , но не во всех случаях. Вы можете переопределить этот метод в этих невыясненных случаях, чтобы разрешить вход , чтобы его отклонили или используйте этот метод, чтобы предотвратить отсутствие в представлении в других случаях.

+0

Благодарим за полезную информацию. Я этого раньше не знал. Тем не менее, клавиатура все еще исчезает даже после того, как я возвращаю 'YES' в' disablesAutomaticKeyboardDismissal'. Настройка стиля презентации на 'UIModalPresentationFormSheet' также не помогает. –

+0

Я попытался удостовериться, что 'disablesAutomaticKeyboardDismissal' вызван правильно, но эта функция вообще не вызвана. Есть идеи? –

+0

Попробуйте установить делегат 'UITextField' на ваш контроллер представления. – Gobot

Смежные вопросы