使用多个 ModalViewController 处理对象

Posted

技术标签:

【中文标题】使用多个 ModalViewController 处理对象【英文标题】:Handling an object with several ModalViewControllers 【发布时间】:2012-01-02 10:32:50 【问题描述】:

我将 UINavigationController 呈现为 ModalViewController。 UINavigationViewController 处理(导航)UIViewControllers 的 segue。使用我的第一个 ModalViewController (MVC),我想创建一个具有多个属性的 NSObject 的新实例。这行得通。

现在,在每个 VC 中,我都有一个滑块来更改对象的多个属性之一。在最后一个 VC 我想保存对象。

我正在使用 CoreData(当我使用 one VC 中的所有属性时,它已经可以使用了)。

有没有一种简单的方法来实现这一点?

(我也在使用NSNotificationCenter。)

编辑:

在 MVC1 中,我通过在我的 UINavigationBar 中按 NextNSNotification 发送到 DetailTableViewController。 MVC1 推送到 MVC2。 1234563

MVC2 有一个UISlider,我想将它存储在我的对象中。所以我做了#import "Object.h", @property (nonatomic, weak) Object * detailItem, @sythesize detailItem 并使用detailItem.property = NSNumber initWithInt etc. 存储了某个值。我按Next。 MVC2 推送到 MVC3。

MVC3 也有#imported ... and @property ...。它在 viewDidLoad: NSLog(@"%i", [detailItem.property intValue]); 中执行并显示 0 而不是 myInteger。我做错了什么?

编辑:

要使这段代码正常工作,需要进行哪些更改?

ModalViewController

- (void)setDetailItem:(Object *)newDetailItem

if (_detailItem != newDetailItem) 
    _detailItem = newDetailItem;

    // Update the view.
    [self configureView];


MasterViewController

- (void)insertNewObject

NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

[newManagedObject setValue:@"New Object" forKey:@"name"];
[self.firstAssistantViewController setDetailItem:(Object *)newManagedObject];

// Save the context.
NSError *error = nil;
if (![context save:&error]) 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();


【问题讨论】:

【参考方案1】:

将新对象作为属性传递给其他模态视图控制器。托管对象包含对托管对象上下文的引用,因此您可以随时保存。

所以,对于每个模态视图控制器:

.h:

@property (nonatomic,weak) Object* newManagedObject;

.m:

@synthesize newManagedObject;

在你展示每个视图控制器之前:

modalViewControllerX.newManagedObject = newManagedObject;

viewWillAppear: 上配置您的 UI(设置滑块值等),如下所示:

self.slider.value = self.newManagedObject.property;

当滑块值改变时使用反向更新托管对象:

self.newManagedObject.property = self.slider.value;

在最终的视图控制器中,如果你想保存在那里,你可以这样做:

NSError *error = nil;
[self.newManagedObject.managedObjectContext save:&error];
// Your own error checking goes here

【讨论】:

这是如何工作的?你有代码sn-p吗?只需在每个 VC 中执行 @property (strong, retain) anyID * anyDetailItem;@synthesize 即可? 差不多了,是的 - 尽管属性应该是 (nonatomic, weak),因为核心数据框架会确保它不会被释放。 我怎么能确定它是对象的同一个实例?我必须在每个 VC 中执行 <NSFetchedResultsController> 还是在创建/保存对象的第一个和最后一个控制器中执行此操作就足够了? 我不关注你,我以为你在一个模态视图控制器中创建一个新的托管对象,然后打开更多的对象来修改它?不需要获取请求,直接传递对象即可。 谢谢jrturton。我编辑了我的问题,以使您更容易理解这一点。非常感谢您的帮助。【参考方案2】:

作为建议,您可以使用NSUserDefault 在不同视图中存储和检索相同的数据,您可以在任何视图控制器中使用NSUserDefaults

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults synchronize] 

【讨论】:

以上是关于使用多个 ModalViewController 处理对象的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 modalviewcontroller 关闭 modalviewcontroller

如何使用 UIModalPresentationPageSheet 调整 modalViewController 的大小

在 iPad 中使用 NavigationController 解除 ModalViewController 当在视图外点击时

如何在 masterViewController 中呈现 modalViewController?

如何在两个控制器中使用相同的 modalViewController?

在 ModalViewController 中维护标题栏