2010-10-31 4 views
13

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

У меня есть 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 < UITextFieldDelegate>:

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

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

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

ответ

17

Хорошо, я понял, простое решение после много веб-серфинга, чтения форума и ручного считывания. Это было, как я подозревал, очень простым, добавилась только одна строка кода. В 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

Спасибо за ваш ответ. Я нашел это также ответом на этот вопрос: http://stackoverflow.com/questions/11319144/ios-xcode-crashed-after-typing-in-texts-in-uitextfield-and-go-back-nsisobject/ 11364617 # 11364617 – zekel

+0

Большое вам спасибо! Это сводило меня с ума. Интуитивно я хотел бы видеть это как поведение по умолчанию. – guptron

+0

Это не работает для меня, segue происходит до 'viewWillDisappear': ( – RnMss

0

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

+0

Спасибо за предложение Джефф. Это может быть то, что мне нужно сделать, но я теряю собственный внешний интерфейс кнопки с заостренным концом, если только я не выполняю много работы по созданию пользовательской кнопки, создав для нее файл PNG и т. Д. И т. Д., Я Я хочу сделать это, если потребуется, чтобы получить функциональность, но я надеюсь на то, чего не хватает, чтобы просто добавить в свой код. – LavaSlider

-1

Я думаю, что с точки зрения 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

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

+0

@LavaSlider просмотреть изменения, чтобы сделать что-то вроде textFieldEditingChanged, о котором вы говорили –

+0

@LavaSlider не слишком сложно реализовать что-то вроде textFieldEditingChanged. См. Исправления для решения –

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

  • Нет связанных вопросов^_^