2013-04-04 2 views
5

В настоящее время я пытаюсь получить эту работу. Любая помощь приветствуется.UITextField внутри UITableViewCell: getFirstResponder in didSelectRowAtIndexPath

У меня есть обычай UITableViewCell, который имеет UITextField внутри. Когда я выбираю ячейку таблицы, я хотел бы сделать первый ответчик UITextField.
Однако [textField becomeFirstResponder]; возвращает false.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    UITextField *textField; 
    for (UIView *view in [cell subviews]) { 
    if ([view isMemberOfClass:[UITextField class]]) { 
     textField = ((UITextField *)view); 
    } 
    } 

    [textField becomeFirstResponder]; 
} 

В соответствии с запросом инициализация текстового поля. Это делается в UITableViewCell подкласса:

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

    if (self) { 
    // Init Textfield 
    _textField = [[UITextField alloc] init]; 
    _textField.backgroundColor = [UIColor clearColor]; 
    _textField.delegate = self; 
    [self addSubview:_textField]; 
    } 

return self; 
} 
+0

Является ли ваш TextField == ноль; ? Я имею в виду, вы можете получить ссылку на текстовое поле? – iphonic

+0

Да, я получаю ссылку на textField. Метод, ставшийFirstResponder, просто возвращает false, поскольку по какой-то причине он не может продвигать textField в firstResponder. –

+0

Пожалуйста, как нам создать 'UITextField'. Может быть, один из ваших методов делегата textfield возвращает NO? –

ответ

3

Дайте tag для каждого использования следующий код UITextField и и:

UITableViewCell* cell = (UITableViewCell*)sender.superview.superview; 
UITextField *txtField = (UITextField*)[cell viewWithTag:tag]; 
[txtField becomeFirstResponder]; 

В didSelectRowAtIndexPath метод.

Его работает очень хорошо .. :)

+0

Я получаю txtField просто отлично с помощью метода, который я использую, но я попробовал ваш, и это, к сожалению, тоже не работает. Каким образом viewWithTag отличается от того, что я делаю? Благодарю. –

+0

i m confuse on ur Que .. u add textField на tblViewCell..если как это называется didSelectRowAtIndexPath ?? проверить по разрыву пинты, это бежать или нет? – iPatel

+0

Добавить этот метод - (BOOL) textFieldShouldReturn: (UITextField *) textField { [textField resignFirstResponder]; возвращение ДА; } – iPatel

0
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    UITextField *textField; 
    for (id subV in [cell subviews]) { 
    if ([subV isKindOfClass:[UITextField class]]) { 
     textField = (UITextField *)subV; 
     [textField becomeFirstResponder]; 
     break; 
    } 
    } 


} 

Я думаю, что это будет полезно для вас.

2

Я считаю, что вам необходимо установить textFielddelegate.

Добавить textField.delegate = self; в ваш метод, прежде чем позвонить [textField becomeFirstResponder]

+0

Текстовое поле является частью ячейки UITableView, которая является делегатом UITextField. Однако я также попытался вызвать startFirstResponder внутри класса ячеек, и это тоже не работает. –

+1

@SebastianBorggrewe Это не хорошая оценка. UITableViewCell - это представление, а не контроллер. Вы должны установить делегат в качестве своего TableViewController, а также убедиться, что он соответствует протоколу UITextFieldDelegate. – Cezar

+0

Спасибо за подсказку. Но он все еще не объясняет, как это происходит? –

2

Я думаю, вы должны включать в себя значение тега на текстовое поле при создании ячейки:

- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

     if (self) { 
     // Init Textfield 
     _textField = [[UITextField alloc] init]; 
     _textField.backgroundColor = [UIColor clearColor]; 
     _textField.delegate = self; 
     _textField.tag = 999; 
     [self addSubview:_textField]; 
     } 

    return self; 
} 

И на методе didSelectRowAtIndexPath использовать значение тега для восстановления объекта:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    UITextField *textField = (UITextField*)[cell viewWithTag:999]; 


    if (![textField isFirstResponder]){ 
    [textField becomeFirstResponder]; 
    } 

} 

У меня есть проверка на контроль, если текстовое поле уже является первый ответчик.

Надеется, что это работает, как вы ожидаете

11

Если у вас есть пользовательские ячейки, то вы можете сделать что-то вроде этого:

@implementation CustomCell 

#pragma mark - UIResponder 

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

- (BOOL)becomeFirstResponder 
{ 
    return [self.textField becomeFirstResponder]; 
} 

@end 

Затем внутри табличный делегата:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if ([cell canBecomeFirstResponder]) { 
     [cell becomeFirstResponder]; 
    } 
} 
+0

Эй, @ josh-fuggle Спасибо за это. Вопрос один год. Поэтому я не могу вспомнить, как я это решил. Но это должно сработать! –

+1

Yup, я понимаю. Я просто хотел показать другой способ решения проблемы. Мне нравится этот дизайн, так как у вас может быть несколько разных подзаголовков, каждый из которых отвечает на UIResponder по-разному, сохраняя при этом один и тот же чистый код в своем представлении. –

+1

Согласовано. Благодаря! –

0

Обновлен ответ от @ josh-fuggle, чтобы использовать Swift 2.2.

import Foundation 
import UIKit 

class CustomTableCell:UITableViewCell { 

    @IBOutlet var textValue: UITextField! 

    override func canBecomeFirstResponder() -> Bool { 
     return true 
    } 

    override func becomeFirstResponder() -> Bool { 
     return self.textValue.becomeFirstResponder() 
    } 
} 

И это в табличном виде делегата:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     let cell = tableView.cellForRowAtIndexPath(indexPath) 
     if ((cell?.canBecomeFirstResponder()) != nil) { 
      cell?.becomeFirstResponder() 
     } 
} 
+0

Кроме того, вам может быть полезно переопределить 'isFirstResponder', чтобы вернуть, является ли ваше поле ввода текста первым ответчиком. –

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