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

How to pass a NSMutableArray to another view

以下代码片段是 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];
....

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

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

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

恕我直言,将值从一个 controller/view 传递到另一个 controller/view 的最佳方法是使用会话(即 Singleton class)。在 swSegue.performBlock 块内的会话中设置值并在 SecViewController.

viewDidLoad 中获取值

编辑:

查看 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];
    ....

我从您提供的代码中发现了一些问题:

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

    来检索您的 segue 的目标视图控制器
    UIViewController *viewController = [segue destinationViewController];
    SecViewController *destination = (SecViewController *)viewController;
    destination.arrayHoldingProperty = self.myArray;
    

    此处假设您已经在 SecViewController class 中定义了 arrayHoldingProperty

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

您正在创建 SecViewController 的另一个实例class

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

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

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