Хранение содержимого UITextField перед просмотром всплывающих окон - PullRequest
13 голосов
/ 31 октября 2010

Я уверен, что это в документации Apple или, должно быть, где-то был дан ответ на этом форуме, так как это кажется таким простым, но я не смог найти ни одно, ни особенно элегантное решение сам.

У меня есть UIViewController, который помещает представление редактирования в свой стек навигации.В представлении редактирования есть куча полей UITextFields.Если один из них редактируется при нажатии кнопки «Назад», метод ViewWillAppear исходного представления вызывается перед вызовом методов делегата UITextField textFieldShouldEndEditing или textFieldDidEndEditing или метода связанного действия IB textFieldEditingEnded.

Вот код, который, я надеюсь, сделает его более понятным:

В UIViewController:

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];
    NSLog( @"Entering view will appear for master view" );
    nameLabelField.text = objectToEdit.name;
}
- (IBAction) editMyObject: (id) sender {
    NSLog( @"Editing the object" );
    EditViewController *evc = [[EditViewController alloc] initWithNibName: @"EditTableView" bundle: nil];
    evc.editedObject = objectToEdit;
    [self.navigationController pushViewController: evc animated: YES];
    [evc release];
}

В EditViewController :

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];
    nameField.text = editedObject.name;
}
- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];
    NSLog( @"In viewWillDisappear" );
    if( [self.navigationController.viewControllers indexOfObject: self] == NSNotFound ) {
        NSLog( @"-- We are not in controller stack... the back button has been pushed" );
    }
}
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {
    NSLog( @"In textFieldShouldEndEditing" );
    // Store text field value here???
    // editedObject.name = nameField.text;
    return YES;
}
- (void) textFieldDidEndEditing: (UITextField *) textField {
    NSLog( @"In textFieldDidEndEditing" );
    // Store text field value here???
    // editedObject.name = nameField.text;
}
- (IBAction) textFieldEditingEnded: (id) sender {
    NSLog( @"In textFieldEditingEnded" );
    // Store text field value here???
    // editedObject.name = nameField.text;
}

Журнал заканчивается:

[...] Появится начальное представление для основного вида
[...] Редактирование объекта
[...] В viewWillDisappear
[...] - мы не в стеке контроллера ... нажата кнопка "Назад"
[...] Появится начальное представление для основного вида
[...] В textFieldShouldEndEditing
[...] В textFieldEditingEnded
[...] В textFieldDidEndEditing

Я хочу установить self.editedObject.name = nameField.text до того, как метка будет установлена ​​в viewWillAppear для UIViewController.

Я думал о методе viewWillDisappear для проверки EditViewController, чтобы увидеть, является ли какое-либо из моих текстовых полей текущим первым респондентом, и если да, то получить их текст и сохранить его, но это похоже на такой клочок, который будетболь, чтобы поддерживать, если я добавляю или изменяю текстовые поля.

Я также могу реализовать связанное действие textFieldEditingChanged IB, чтобы задавать текст в редактируемом объекте после каждого нажатия клавиши, но это также немного накладные расходы, так как я должен выяснить, какое текстовое поле я в каждомнажатие клавиши (помните, что я только показал name, но их целая куча).

Все, что мне нужно, это чтобы редактирование было завершено или знать, что редактирование будет завершено до вызова viewWillAppear в UIViewControllerпоэтому nameFieldLabel правильно установлен.

Ответы [ 3 ]

17 голосов
/ 01 ноября 2010

Хорошо, я нашел простое решение после большого количества веб-серфинга, чтения форумов и чтения вручную. Это было, как я подозревал, очень просто, только одна строка кода была добавлена. В методе viewWillDisappear в EditViewContorller я просто добавил:

    [self.view.window endEditing: YES];

Теперь textFieldShouldEndEditing, textFieldEditingEnded и textFieldDidEndEditing все выстрелили раньше, чем viewWillAppear главного вида.

Так что теперь метод viewWillDisappear выглядит так:

- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];
    NSLog( @"In viewWillDisappear" );
    // Force any text fields that might be being edited to end so the text is stored
    [self.view.window endEditing: YES];
}

И методы, которые уже используются для обработки возврата на клавиатуре, также обрабатывают кнопку «Назад» на навигационном контроллере.

Спасибо Аарону и Джеффу за вашу помощь и за то, что помогли мне обдумать это.

0 голосов
/ 31 октября 2010

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

Оповещением пользователя, вы можете увидеть, нажали ли они кнопку случайно или если они решили покинуть окно просмотра, выполните соответствующее действие.

// add this to the field(s) to be edited, selector will be called as the changes
// are being made... still difficult to handle a cancel, but should work
[objectToEdit addTarget:self action:@selector(updateNameField:) 
                         forControlEvents:UIControlEventEditingChanged];

дополнительный код здесь ...

// the method called to update object from parent view
- (void)updateNameField:(id)sender {
    <OBJECT TO UPDATE>.text = ((UITextField *)sender).text;
}
0 голосов
/ 31 октября 2010

Почему бы просто не создать собственную кнопку «Назад» с этой логикой в ​​методе действия?

...