使用多个 ModalViewController 处理对象
Posted
技术标签:
【中文标题】使用多个 ModalViewController 处理对象【英文标题】:Handling an object with several ModalViewControllers 【发布时间】:2012-01-02 10:32:50 【问题描述】:我将 UINavigationController
呈现为 ModalViewController。 UINavigationViewController
处理(导航)UIViewController
s 的 segue。使用我的第一个 ModalViewController (MVC),我想创建一个具有多个属性的 NSObject
的新实例。这行得通。
现在,在每个 VC 中,我都有一个滑块来更改对象的多个属性之一。在最后一个 VC 我想保存对象。
我正在使用 CoreData(当我使用 one VC 中的所有属性时,它已经可以使用了)。
有没有一种简单的方法来实现这一点?
(我也在使用NSNotificationCenter
。)
编辑:
在 MVC1 中,我通过在我的UINavigationBar
中按 Next
将 NSNotification
发送到 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?