【问题标题】:iPhone Programming - Passing NSMutableArray between view controllersiPhone 编程 - 在视图控制器之间传递 NSMutableArray
【发布时间】:2011-12-29 03:13:02
【问题描述】:

我有一个 RootViewController 和一个 DetailViewController,我试图将 NSMutableArray 从 rootView 传递到 detailView。我在 DetailViewController 中创建了一个 RootViewController 的对象,并像下面这样访问它

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

detailViewArray = [root.rootViewArray copy];

注意:这两个数组都在 .h 文件中声明;合成然后分配初始化 array = [[NSMutableArray alloc] init];

问题:我不太清楚为什么它仍然不起作用。我在互联网上尝试了很多解决方案,但对我来说并不完全有效。根数组的属性是 nonatomic, retain 有什么问题吗?我是否需要将其更改为某些东西,或者我遵循的方法不正确.. 请如果有人可以提供帮助!

【问题讨论】:

    标签: iphone ios cocoa-touch uiviewcontroller nsmutablearray


    【解决方案1】:

    甚至还有另一种传递数组的方式。

    MyViewController mvc = [[MYViewController alloc] initWithNibName:@"MYViewController" bundle:[NSBundle mainBundler]];
    
    [mvc getDataArray:<pass your array>];
    
    [self.navigationController pushViewController:mvc animated:YES];
    

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

    当您非常关心内存时,这将很有用。因为如果您使用的是静态(sharedInstance),那么它的作用域会在整个应用程序范围内持久化。

    【讨论】:

    • 如果你想直接传递它,你应该使用委托。直接设置它会创建视图的紧密耦合。
    • @bryanmac:哦,我对代表没有太多想法。可以给个例子代码吗?
    • 在我上面的回答中有几个链接。
    • @Mrunal:您的解决方案不起作用。我试过这个,你只能设置int、float值,但不能设置Array或string值。至少我做不到。
    【解决方案2】:

    如果您在 DetailViewController 中分配/初始化 RootViewController,则您正在创建 RootViewController 的另一个实例。您没有获得 rootViewController 的相同实例(带有数据)。

    也就是说,即使将 viewController 的引用传递给另一个 viewController 以查看它的数据,这也有点糟糕。它在视图之间创建了紧密耦合。

    相反,如果您需要获取数据,请考虑使用委托在视图之间进行通信。

    What exactly does delegate do in xcode ios project?

    教程:

    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 - 这正是苹果推荐代表的原因。让一个视图直接在另一个视图上设置数据会导致您的视图紧密耦合。
    猜你喜欢
    • 2010-12-14
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2018-06-22
    • 2012-04-20
    • 2011-07-09
    相关资源
    最近更新 更多