iPhone编程 - 在视图控制器之间传递NSMutableArray

3

我有一个RootViewController和一个DetailViewController,在其中我尝试从rootView传递一个NSMutableArray到detailView。我在DetailViewController中创建了一个RootViewController的对象,并像以下方式访问它:

RootViewController *root = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];

detailViewArray = [root.rootViewArray copy];

请注意:这两个数组是在.h文件中声明的;它们会被合成,然后分配和初始化。
问题:我不确定为什么它仍然无法工作。我已经尝试了很多互联网上的解决方案,但它并没有完全适用于我。根数组的属性是非原子性保留。这有什么问题吗?我需要改变它还是我遵循的方法不正确..如果有人能帮忙,请!
2个回答

3
如果你在DetailViewController中alloc/init RootViewController,那么你将创建另一个RootViewController的实例。你没有得到相同的带有数据的rootViewController实例。
话虽如此,即使将一个viewController的引用传递给另一个viewController来操作它的数据也有点不好。这会在视图之间创建紧密的耦合。
相反,如果需要获取数据,请考虑使用委托在视图之间进行通信。 什么是委托在xcode ios项目中的作用? 教程:

http://www.theappcodeblog.com/2011/04/15/passing-data-between-views-tutorial-using-a-protocol-delegate-in-your-iphone-app/

另一个选项是创建共享模型(阅读有关模型视图控制器模式的内容)。在该模式中,通常会创建一个模型,并通过获取模型的单例实例来共享数据:
MyModel *model = [MyModel sharedInstance];

然后,每个视图都可以从该模型的同一(单例)实例中设置和读取数据。

应该选择哪个?如果许多视图共享相同的数据,则使用模型更好。如果需要几个视图通过回调进行通信,则代理是适当的。


甚至有另一种传递数组的方式。MyViewController mvc = [[MYViewController alloc] initWithNibName:@"MYViewController" bundle:[NSBundle mainBundler]];[mvc getDataArray:<传递我的数组>]; - Mrunal
@mrunal - 这正是为什么苹果推荐使用委托代理的原因。直接让一个视图设置另一个视图的数据会造成视图之间紧密耦合。 - bryanmac

0

即使有另一种传递数组的方式。

MyViewController mvc = [[MYViewController alloc] initWithNibName:@"MYViewController" bundle:[NSBundle mainBundler]];

[mvc getDataArray:<pass your array>];

[self.navigationController pushViewController:mvc animated:YES];

这里将首先设置一个dataArray属性,然后将视图控制器推到MyViewController类。

当您非常关注内存使用时,这将非常有用。因为如果您使用静态(sharedInstance),那么其范围将在整个应用程序范围内持续存在。


如果您想直接传递它,您应该使用委托(delegate)。直接设置会导致视图之间的紧密耦合。 - bryanmac
@bryanmac:哦,我对委托不是很了解。你能否给一个示例代码? - Mrunal
在我的上面的回答中有几个链接。 - bryanmac
@Mrunal:你的解决方案不可行。 我已经尝试过,你只能设置整数、浮点数值,但不能设置数组或字符串值。 至少我无法做到这一点。 - AsifHabib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接