передача данных / объектов / moc между viewcontrollers - наилучшая практика - PullRequest
1 голос
/ 24 ноября 2011

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

У меня есть приложение для iOS / iphone с типичной моделью. UITabBarController, содержащий несколько UINavigationControllers.

В одном из контроллеров навигации у меня есть контроллер представления с табличным представлением в нем. Этот tableView заполняется из извлеченного основного объекта Data, называемого «тегами». Когда я устанавливаю tableView с помощью UIBarButtonItem (Add), кнопка добавления должна работать следующим образом: мне нужно создать новый объект «tag» для этой сущности, заполнить объект некоторыми известными данными, а затем предложить пользователю выполнить детализацию. вниз на 3 уровня классификации (Регион -> область -> тема), чтобы добраться до объекта темы. Затем мне нужно добавить этот объект 'topic' в отношение оригинального недавно добавленного объекта 'tag' (3 просмотра дальше вниз по стеку). - Надеюсь, это ясно.

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

- (void)addTag {    

NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[newManagedObject setValue:@"(untitled)" forKey:@"tagID"];

NSError *error;
if (![context save:&error])
    NSLog(@"Error saving entity: %@", [error localizedDescription]);


ChooseRegion *aView = [[[ChooseRegion alloc] init] autorelease];
aView.theTag = newManagedObject;

[self.navigationController pushViewController:aView animated:YES];

}

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

Всегда более чем один способ снять шкуру с кошки, но с какого подхода я должен бороться с этим. Должен ли я передавать объект «тег» вперед и сохранять его в третьем представлении или передавать обратно выбранную тему и сохранять в исходном представлении, в котором был создан объект «тег»?

Большое спасибо заранее.

1 Ответ

2 голосов
/ 24 ноября 2011

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

В вашем случае, когда пользователь выберет объект тега в третьем представлении, я отправлю уведомление следующим образом:

[[NSNotificationCenter defaultCenter] postNotificationName:@"tagSelected" object:myTag];

Теперь, в контроллере, который имеет кнопку «Добавить», заставьте его подписаться на это событие:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTagSelected:) name:@"tagSelected" object:nil];

Убедитесь, что вы реализуете метод handleTagSelected: и в этом методе вы можете получить объект тега и закрыть развернутое представление, которое вы открыли:

- (void)handleTagSelected:(NSNotification *)notification {
    Tag *mytag = (Tag *)notification.object;
    [self dismissModalViewControllerAnimated:YES];
}

Тогда вы можете делать с тегом все, что захотите.

...