在viewcontrollers之间传递data / objects / moc - 最佳实践

时间:2011-11-24 16:21:50

标签: objective-c core-data uiviewcontroller properties uinavigationcontroller

我有一个我怀疑很常见的场景,我在回答其他类似问题时发现了各种想法,包括设置IBOutlets,将NSmanagedobjects作为属性传递,只使用一个视图控制器但是交换视图但我是不确定哪种方法最适合我的解决方案。

我有一个具有典型型号的iOS / iphone应用程序。 UITabBarController包含多个UINavigationControllers。

在其中一个导航控制器中,我有一个带有tableView的viewcontroller。此tableView是从获取的核心数据实体填充的,称为“标记”。当我使用UIBarButtonItem(Add)设置tableView时,添加按钮需要表现如下:我需要它为该实体创建一个新的'tag'对象,并用一些已知数据填充该对象,然后提示用户钻取向下3级分类(Region - > area - > topic)以​​到达主题对象。然后我需要将“主题”对象添加到原始新添加的“标记”对象的关系中(在堆栈下方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),这是3个视图中的第一个。在每个didSelectRowAtIndexPath代码将选定的行和这个'tag'对象传递给下一个视图,我不确定这是否正确,因为我不确定当我到达第3个视图上的主题对象时该怎么办? ??我迷路了。

不止一种方法可以给猫皮肤涂抹,但是我应该采取什么方法来解决这个问题。我应该向前传递'tag'对象并将其保存在第3个视图中,还是将所选主题传回并保存在创建'tag'对象的原始视图中?

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

我会使用通知。通知是解耦部分应用程序的简单方法,但仍然可以将它们协同工作。

在您的情况下,当用户在第3个视图中选择标记对象时,我会发送通知:

[[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];
}

然后你可以用标签做任何你想做的事。