Подвид UITextField UITableViewCell, чтобы стать первым респондентом?

У меня есть приложение с основными данными, которое использует контроллер навигации для перехода к подробному представлению, а затем, если вы редактируете одну из строк данных в подробном представлении, вы попадаете в представление редактирования для этой единственной строки, как в Apple CoreDataBooks пример (за исключением того, что CoreDataBooks использует только UITextField сам по себе, а не тот, который является подвидом UITableViewCell, как у меня)!

Вид редактирования - это UITableviewController, который программно создает свою таблицу с одной строкой раздела и UITextfield в ячейке.

Я хочу, чтобы произошло то, что вы выбираете строку для редактирования, и представление редактирования помещается в стек навигации, а представление редактирования анимируется, перемещаясь по экрану, я хочу, чтобы текстовое поле было выбрано как firstResponder, чтобы клавиатура уже отображалась по мере того, как вид перемещается по экрану, чтобы занять позицию. Как в приложении "Контакты" или в приложении CoreDataBooks.

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

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [theTextField becomeFirstResponder];
}

Вы не можете поместить это в -viewWillAppear, поскольку текстовое поле еще не создано, поэтому theTextField равно нулю. В приложении CoreDataBooks, где они достигают того, чего я хочу, они загружают свое представление из пера, поэтому они используют тот же код, но в -viewWillAppear, поскольку текстовое поле уже создано!

Есть ли способ обойти это без создания пера, я хочу сохранить программную реализацию, чтобы обеспечить большую гибкость.

Огромное спасибо


person Daniel Granger    schedule 17.04.2010    source источник


Ответы (4)


После разговора с командой поддержки Apple Dev у меня есть ответ!

Что вам нужно сделать, так это создать UITextField вне экрана в -(void)loadView; и затем установить его как первого респондента, а затем в методе viewDidLoad вы можете установить UITextField в UITableViewCell как первого респондента. Вот пример кода (помните, я делаю это в UITableViewController, поэтому я также создаю табличное представление!

- (void)loadView
{
    [super loadView];

    //Set the view up.
    UIView *theView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.view = theView;
    [theView release];

    //Create an negatively sized or offscreen textfield
    UITextField *hiddenField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, -10, -10)];
    hiddenTextField = hiddenField;
    [self.view addSubview:hiddenTextField];
    [hiddenField release];

    //Create the tableview
    UITableView *theTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] bounds] style:UITableViewStyleGrouped];
    theTableView.delegate = self;
    theTableView.dataSource = self;
    [self.view addSubview:theTableView];
    [theTableView release];

    //Set the hiddenTextField to become first responder
    [hiddenTextField becomeFirstResponder];

    //Background for a grouped tableview
    self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    //Now the the UITableViewCells UITextField has loaded you can set that as first responder
    [theTextField becomeFirstResponder];
}

Надеюсь, это поможет любому, кто застрянет в таком же положении, как я!

Если кто-то еще может найти лучший способ сделать это, скажите, пожалуйста.

person Daniel Granger    schedule 22.04.2010
comment
Я боролся с этим больше года. Иногда я получал решение, которое могло бы работать, но тогда новое обновление для iOS ломало его. Так раздражает. Это лучшее решение, которое я видел на сегодняшний день, несмотря на то, насколько оно хакерское. - person Hilton Campbell; 14.08.2010
comment
Спасибо за этот отличный хак, но я не понимаю, зачем нам «hiddenTextField»? Указывают ли «hiddenTextField» и «theTextField» на один и тот же экземпляр UITextField? - person Benji Mizrahi; 20.02.2011
comment
когда вы используете этот хак, вы видите курсор? Я пробовал использовать настраиваемую uitableviewcell с uitextview: клавиатура открывается, но на uitextview нет фокуса. - person Sefran2; 04.06.2011
comment
Я использовал это, но я не использовал отрицательный фрейм и не помещал textField в представление перед добавлением его в UITableViewCell. Кроме того, мне не нужно было делать это первым респондентом в loadView. Он работал, создавая объект UITextField в loadView и делая его первым респондентом в ViewDidAppear. - person Denis Kutlubaev; 14.02.2013
comment
@wzbozon, можешь подробнее рассказать? Ваше решение звучит немного лучше. - person stewart715; 15.02.2014

Попробуйте сделать это в методе viewDidAppear, у меня работает.

person Dennis Wong    schedule 03.09.2011

Я думаю, что очевидным решением является создание текстового поля в методе init контроллера представления. Обычно вы настраиваете представление, потому что контроллеру представления требуется заполненное свойство представления.

Затем вы можете установить текстовое поле в качестве первого респондента в viewWillAppear, и клавиатура должна быть видна при перемещении представления.

person TechZen    schedule 17.04.2010
comment
В настоящее время я создаю UITextField в - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath вместе с ячейкой. Я инициализировал UITextField в методе инициализации и поместил статьFirstResponder в viewWillApper, но клавиатура по-прежнему не скользила, она появилась только после того, как представление скользнуло. Что я не могу понять!?! - person Daniel Granger; 17.04.2010
comment
Нет, вам нужно создать новое текстовое поле в подробном представлении и установить его в качестве первого респондента. Если вы установите это до того, как представление действительно появится, оно должно появиться с уже видимой клавиатурой. Вы не можете передать первого респондента одного представления другому представлению, помещенному в стек навигации. Первый респондент таблицы не будет иметь никакого влияния на первого респондента навигационного представления, независимо от того, как он выглядит для пользователя. - person TechZen; 18.04.2010
comment
Подробное представление - это представление, которое пользователь в данный момент просматривает, прежде чем коснуться строки, чтобы перейти в режим редактирования, на котором есть текстовое поле. Я не уверен, понимаю ли я, как размещение текстового поля с firstresponder в представлении, которое вот-вот исчезнет, ​​заставит клавиатуру появиться в представлении, которое вот-вот появится? Причина, по которой я думаю, что это не работает, заключается в том, что представление таблицы не создается до тех пор, пока оно не появится, поэтому вы не можете выбрать первого респондента в текущем текстовом поле до того, как представление появится, поскольку оно еще не было создано! Но потом Apple, похоже, каким-то образом делает это в приложении "Контакты". - person Daniel Granger; 18.04.2010

вы пробовали использовать методы делегата uinavigationcontroller ?:

navigationController: willShowViewController: анимированный:

person Remover    schedule 18.04.2010
comment
Привет, удалитель, спасибо за ответ! Я только что попробовал, и это снова не сработало. UITextField равен нулю в то время, когда вызывается navigationController: willShowViewController: animated:, я полагаю, по тем же причинам, что и выше. Если не существует возможности создания текстового поля в таблице до загрузки представления, я думаю, единственный способ - сделать это из пера! - person Daniel Granger; 19.04.2010