如何将 NSMutableArray 传递给另一个视图

Posted

技术标签:

【中文标题】如何将 NSMutableArray 传递给另一个视图【英文标题】:How to pass a NSMutableArray to another view 【发布时间】:2015-09-02 12:01:21 【问题描述】:

以下代码片段是prepareForSegue 方法的一部分。我想将self.mutaArr(MutableArray)传递给SecViewController(这是UIViewController)。

由于以下行,这没有通过:

[navController setViewControllers:@[dvc] animated: NO ];

如果我通过s,我最终会出现黑屏。因此,我该如何排序?

请注意,我也在使用SWRevealViewController

if ([segue isKindOfClass:[SWRevealViewControllerSegue class]]) 

    SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;    
    swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) 

    if ([[segue identifier] isEqualToString:@"gosegue"]) 

        UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
        SecViewController *s = [[SecViewController alloc] init];
        s.myMutableArr= self.mutaArr;
        [navController setViewControllers:@[dvc] animated: NO ];
        [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
....

【问题讨论】:

segue 期间svc 是什么?当您切换到查看 dvc 时,s 应该是什么@ 你为什么首先在prepareForSegue中使用setViewControllers?此外,您从不使用s 变量,因此self.mutaArr 不会在任何地方传递也就不足为奇了。 一点,如果你确实要把它放在一个单例中,当然只需把它放在 AppDelegate 中。只需向 AppDelegate.h 添加一个属性,就这么简单。 【参考方案1】:

我从您提供的代码中看到了一些问题:

    您必须在 segue 的目标视图控制器中定义一个属性,该属性可以保存您的数组并在源视图控制器的 prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法中设置它。这可确保您转换之前设置数据结构(即数组)。您可以通过以下方式检索您的 segue 的目标视图控制器

    UIViewController *viewController = [segue destinationViewController];
    SecViewController *destination = (SecViewController *)viewController;
    destination.arrayHoldingProperty = self.myArray;
    

    这里假设您已经在 SecViewController 类中定义了 arrayHoldingProperty

    完成第一步后,您可以使用performSegueWithIdentifier:@"whatever" sender:nil 方法从任何您想要的地方执行转场。

【讨论】:

【参考方案2】:

我没有看到你的变量s 的任何作用,除了设置一个可变数组,你有没有把这个控制器推到任何地方?也许:

SecViewController *s = [[SecViewController alloc] init];
s.myMutableArr= self.mutaArr;

navController setViewControllers:@[s] animated: NO ];  // Notice `s` replaced `dvc`

恕我直言,将值从一个控制器/视图传递到另一个控制器/视图的最佳方法是使用会话(即单例类)。在swSegue.performBlock 块内的会话中设置值并在SecViewControllerviewDidLoad 中获取值。

编辑

查看this tutorial 以了解单例实现。在第二个示例中,someProperty 可以是 your array

为了获得黑屏,我只是注意到您没有将navController 反映到self.revealViewController

也许使用这个:

- (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated; 

self.revealViewController 上推送navController 可能会修复黑屏问题。

编辑:

试试这样:

if ([[segue identifier] isEqualToString:@"gosegue"]) 

    UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
    SecViewController *s = [[SecViewController alloc] init];
    s.myMutableArr= self.mutaArr;
    [navController setViewControllers:@[s] animated: NO ];
    [self.revealViewController pushFrontViewController:s animated: YES];
    // OR
    //[self.revealViewController pushFrontViewController:navController animated: YES];
    ....

【讨论】:

当我设置@['s'] 我得到一个空白屏幕。你能告诉我一个关于如何设置为单例类的详细示例 你能告诉我如何通过它。我有点困惑。 我收到此错误No visible @interface for 'SWRevealViewController' declares the selector 'pushFrontViewController:animated:' 您是否使用此控件:github.com/John-Lluch/SWRevealViewController 请参阅Basic API Description 部分中列出的此功能。可能你需要更新这个 API 吗?【参考方案3】:

你正在创建另一个 SecViewController 类的实例

  SecViewController *s = [[SecViewController alloc] init];

不要使用这个而不是使用这个:

 SecViewController *s = (SecViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"SecViewController"];
 s.myMutableArr= self.mutaArr;

【讨论】:

以上是关于如何将 NSMutableArray 传递给另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

将按下的按钮传递给另一个 View JSON

将 NSMutableArray 分配给另一个时的奇怪行为(iOS 6)

Objective-C:如何将对象树传递给远程分布式对象?

如何将数组传递给另一个活动?

如何将关键部分传递给另一个线程?

如何将变量从一个类传递给另一个?