2014-01-16 4 views
1

У меня есть вид таблицы, внутри которого я должен показать два текстовых поля для каждой строки.iOS: ошибка утверждения клавиатуры на UITextField

UITextField *tfName = [[UITextField alloc] initWithFrame:CGRectMake(110, baseYCordinate, 180, 30)]; 
     tfName.textAlignment = NSTextAlignmentRight; 
     tfName.textColor = [UIColor whiteColor]; 
     tfName.delegate = self; 
     [tfName setFont:[UIFont fontWithName:@"Avenir-Heavy" size:14]]; 
     tfName.tag = indexPathRow; 
     [tfName addTarget:self action:@selector(tfNameDidChange:) forControlEvents:UIControlEventEditingChanged]; 
     [tfName resignFirstResponder]; 
     [tfName setReturnKeyType:UIReturnKeyDone]; 
     [tfName addTarget:self 
       action:@selector(tfNameFinished:) 
       forControlEvents:UIControlEventEditingDidEndOnExit]; 
     [cell addSubview:tfName]; 


UITextField *tfLocation = [[UITextField alloc] initWithFrame:CGRectMake(110, baseYCordinate, 180, 30)]; 
     tfLocation.textAlignment = NSTextAlignmentRight; 
     tfLocation.textColor = [UIColor whiteColor]; 
     [tfLocation resignFirstResponder]; 
     tfLocation.delegate = self; 
     [tfLocation setFont:[UIFont fontWithName:@"Avenir-Heavy" size:14]]; 
     [tfLocation addTarget:self action:@selector(tfLocationDidChange:) forControlEvents:UIControlEventEditingChanged]; 
     tfLocation.tag = indexPathRow; 
     [tfLocation setReturnKeyType:UIReturnKeyDone]; 
     [tfLocation addTarget:self 
        action:@selector(tfLocationFinished:) 
     forControlEvents:UIControlEventEditingDidEndOnExit]; 
     [cell addSubview:tfLocation]; 

Я добавил следующие методы:

-(BOOL) textFieldShouldReturn: (UITextField *) textField{ 
    [[self view] endEditing:YES]; 
    [textField resignFirstResponder]; 

    return YES; 
} 

-(void)tfNameDidChange:(UITextField *)tfName{ 
    NSLog(@"tfName for device: %ld Value: %@", (long)tfName.tag, tfName.text); 

} 

-(void)tfLocationDidChange:(UITextField *)tfLocation{ 
    NSLog(@"tfLocation for device: %ld Value: %@", (long)tfLocation.tag, tfLocation.text); 

} 

-(void)tfNameFinished:(UITextField *)tfName{ 
    NSLog(@"tfName for device: %ld Value: %@", (long)tfName.tag, tfName.text); 
    [tfName resignFirstResponder]; 
} 


-(void)tfLocationFinished:(UITextField *)tfLocation{ 
    NSLog(@"tfLocation for device: %ld Value: %@", (long)tfLocation.tag, tfLocation.text); 
    [tfLocation resignFirstResponder]; 
} 

UPDATE:

Я получаю динамические обновления для данных, отображаемых в таблице. После того, как обновление приходит я называю

[self.tableView reloadData]; 

Если клавиатура дисплея для любого из текстового поля UITableViewCell, то reloadData вызывает сбой со следующей ошибкой:

провалом утверждения - [UIKeyboardTaskQueue waitUntilAllTasksAreFinished]

Я попытался явно закрыть клавиатуру, используя

[[self view] endEditing:YES]; 

В этом случае сама эта строка вызывает сбой.

Пожалуйста, помогите.

+1

привет, Могу ли я узнать, почему вы пишете строку: [[вид самостоятельной] endEditing: YES]; – hpp

+0

@hpp: Проблема с сбоем возникает, главным образом, когда пользователь нажимает на первое текстовое поле и, не отпуская его клавиатуру, переходит во второе ключевое поле. Поэтому я пишу эту строку, чтобы отклонить все клавиатуры, связанные с текстовыми полями. Видел это как решение для какой-то другой проблемы в stackoverflow и использовал его. – Pria

ответ

0

Попробуйте

-(void)tfLocationFinished:(UITextField *)tfLocation{ 
    NSLog(@"tfLocation for device: %ld Value: %@", (long)tfLocation.tag, tfLocation.text); 
    //[tfLocation resignFirstResponder]; 
    [[self view] endEditing:YES]; 
} 

Или попробуйте это

-(void)tfLocationFinished:(UITextField *)tfLocation{ 
    NSLog(@"tfLocation for device: %ld Value: %@", (long)tfLocation.tag, tfLocation.text); 
    [tfLocation resignFirstResponder]; 
    //[[self view] endEditing:YES]; 
} 
+0

Я пробовал оба. Все еще вызывает крушение. Иногда это случается в первый раз. Несколько раз падает после нескольких кликов. – Pria

+0

@Pria Пробовал ли вы это во всех функциях ('textFieldShouldReturn:', 'tfNameFinished:')? – Mani

+0

Я узнал точную причину аварии. Но все еще не в состоянии удалить его. У меня динамическое обновление в таблице, где я перезагружаю данные таблицы, и если клавиатура отображается на экране, то перезагрузка данных вызывает крушение. Я обновил свой вопрос. – Pria

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