0

我有许多视图控制器,我通过子视图上定义的属性传递对象并在推送之前分配。我期望后续视图上对象的任何更改都会反映在父视图上,并最终反映在我的主视图控制器上,从链开始。因此,该对象必须作为新实例在视图控制器之间复制,而不是通过引用(指针)传递。

代码示例... [为清楚起见,此代码使用 UIPopoverController]

SurveyListTableViewController *surveyList = [[SurveyListTableViewController alloc] init];
surveyList.surveys = self.surveys;
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:surveyList];
surveyPopoverController = [[UIPopoverController alloc] initWithContentViewController:navController];

另一个代码示例... [此示例有一个核心数据托管对象“计划”正在传递]

UIStoryboard *storyboard = mainCanvasViewController.storyboard;
AddPlanViewController *addPlanViewController = [storyboard instantiateViewControllerWithIdentifier:@"AddPlanViewController"];
addPlanViewController.plan = [NSEntityDescription insertNewObjectForEntityForName:@"Plan" inManagedObjectContext:self.managedObjectContext];
[self.navigationController pushViewController:addPlanViewController animated:YES];

无论如何我可以强制通过引用/指针而不是值/副本传递吗?还是我需要完全不同的方法?...

提前谢谢了。迈克尔。

4

2 回答 2

0

如果你传递一个对象,你几乎总是传递一个对它的引用(而不是一个副本)。通过副本实际上并不是很容易。

如果您认为它是副本,因为更改未反映在原始文件中,请确保您实际存储了更改。您可能正在为您的对象重新分配值(也就是说,您每次都在调用初始化并重置对象)确保您只声明和初始化一次对象。

老实说,最好的策略是只传递对包含您要编辑的对象的原始类的引用,然后使用这些对象。因此,使用您的弹出框控制器添加一个名为parentVC. 然后在弹出框内你可以做parentVC.nameOfObject(​​假设对象是视图控制器的属性。

于 2012-07-17T18:51:35.007 回答
0

查看您正在设置的属性的语义。一些属性被设置为复制他们设置的东西,其他的只是保留这个东西。例如,字符串属性几乎总是设置为copy,原因有两个:1) 像 NSString 这样的不可变类型无论如何都会保留而不是复制,2) 如果有人碰巧传入了一个可变字符串,您通常不想更改它就在他们的鼻子底下。

无论如何,您可能会发现自己处理副本而不是原始对象的最可能原因是属性语义是这样设置的。如果这是问题所在并且属性是代码的一部分,那么您显然可以更改属性声明以满足您的需要。否则,解决方案是让有问题的视图控制器做他们的事情,然后在关闭它们之前检索属性。

于 2012-07-17T19:48:31.297 回答