我有一个我怀疑很常见的场景,我发现了各种想法来回答其他类似的问题,包括设置 IBOutlet、将 NSmanagementobjects 作为属性传递以及仅使用一个视图控制器但交换视图,但我不确定这将是为我的解决方案实施的最佳想法。
我有一个具有典型模型的 iOS/iPhone 应用程序。 UITabBarController 包含多个 UINavigationController。
在其中一个导航控制器中,我有一个带有 tableView 的视图控制器。该 tableView 是从获取的核心数据实体(称为“标签”)填充的。当我使用 UIBarButtonItem (添加)设置 tableView 时,添加按钮需要表现如下:我需要它为该实体创建一个新的“标签”对象,并使用一些已知数据填充该对象,然后提示用户钻取向下3级分类(区域->区域->主题)以达到主题对象。然后,我需要将该“主题”对象添加到原始新添加的“标签”对象的关系中(堆栈中进一步向下的 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 代码都会将选定的行和此“标记”对象传递到下一个视图,我不确定这是否正确,因为我不确定当我到达第三个视图上的主题对象时该怎么做? ??我迷路了。
给猫剥皮的方法总是不止一种,但我应该用什么方法来解决这个问题。我应该向前传递“标签”对象并将其保存在第三个视图中,还是传回所选主题并将其保存在创建“标签”对象的原始视图中?
提前谢谢了。
我会为此使用通知。通知是一种解耦应用程序各个部分的简单方法,但仍然让它们一起工作。
在您的情况下,当用户在第三个视图中选择标签对象时,我会发送这样的通知:
[[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];
}
然后你就可以用标签做任何你想做的事情了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)