взятие строки из текстового поля и передача ее предыдущему viewController - PullRequest
1 голос
/ 28 февраля 2011

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

проблема, с которой я сталкиваюсь, заключается в передаче информации, введенной в текстовом файле, обратно в первый контроллер представления. это должно быть очень просто, но все, что я пробую, просто не работает

каков лучший способ обойти это.

спасибо

Ответы [ 3 ]

4 голосов
/ 28 февраля 2011

Вы, вероятно, думаете о проблеме в обратном направлении. В системе MVC, такой как Cocoa, работа контроллеров представления заключается в управлении представлениями, а не данными. Создайте объект модели для хранения данных, которые вы обновляете. Когда вы создаете контроллер представления, передайте ему объект модели. Это может обновить модель с изменениями, которые делает пользователь. Не следует беспокоиться о том, кто его назвал или кому он возвращается. Он должен просто обновить объект модели, а другие заинтересованные стороны должны прочитать объект модели. Как пример:

  • SettingsViewController будет иметь модельный объект с именем Settings
  • Когда вы погружаетесь в контроллер детального вида, например EmailViewController, вы передаете ему настройки как emailViewController.settings = self.settings, прежде чем представить его.
  • Когда пользователь вносит изменения, просто обновите объект, как self.settings.emailAddress = ...

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

2 голосов
/ 28 февраля 2011

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

Например, в толкаемом виде сделать что-то вроде:

FirstViewController *firstViewController = [[[self navigationController] viewControllers] objectAtIndex:0];

[firstViewController setTextEntry:[textfield text]];
1 голос
/ 28 февраля 2011

Я нашел самый простой способ сделать это с помощью NSNotificationCenter.

В ViewController с TableView:

- (void)updateRowValue:(NSNotification *)notification{
     NSDictionary *valuesDictionary = [[NSDictionary alloc] initWithDictionary:   [notification userInfo] copyItems:NO];

     NSString *newString = [valuesDictionary objectForKey:@"StringVal"]
}

Этот метод вызывается при выборе строки

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     TextFieldViewController *tfvc = [[TextFieldViewController alloc] init];
     [tfvc setPostNotificationString:@"updateRowValue"];
     [self.navigationController pushViewController:tfvc animated:YES];
}

Теперь в viewController с textField, когда вы нажимаете кнопку, чтобы вернуться к предыдущему viewController, вызовите это:

- (IBAction)saveButtonPressed{
     NSArray *valuesArray = [[NSArray alloc] initWithObjects:textField.text,nil];
     NSArray *keyArray = [[NSArray alloc] initWithObjects:@"StringVal",nil];
     NSDictionary *dictionary = [[[NSDictionary alloc] initWithObjects:valuesArray forKeys:keyArray] autorelease];

     [[NSNotificationCenter defaultCenter] postNotificationName:[self postNotificationString] object:self userInfo:dictionary];
     [[self navigationController] popViewControllerAnimated:YES];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...