代码之家  ›  专栏  ›  技术社区  ›  Illep

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

  •  0
  • Illep  · 技术社区  · 9 年前

    以下代码片段是 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];
    ....
    
    3 回复  |  直到 9 年前
        1
  •  0
  •   Dree    9 年前

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

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

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

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

    2. 完成第一步后,您可以使用 performSegueWithIdentifier:@"whatever" sender:nil 方法

        2
  •  0
  •   NeverHopeless    9 年前

    我看不出你的变量有什么作用 s 除了设置可变数组之外,您是否将此控制器推到任何位置?也许:

    SecViewController *s = [[SecViewController alloc] init];
    s.myMutableArr= self.mutaArr;
    
    navController setViewControllers:@[s] animated: NO ];  // Notice `s` replaced `dvc`
    

    IMHO,将值从一个控制器/视图传递到另一个控制器或视图的最佳方法是使用会话(即Singleton类)。在内部会话中设置值 swSegue.performBlock 阻止并获取值 viewDidLoad 属于 SecViewController .

    编辑 :

    看看 this tutorial 用于单例实现。在第二个例子中 someProperty 可以是 your array .

    对于黑屏,我只是注意到你没有反映 navController self.revealViewController .

    也许可以使用以下方法:

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

    推动 导航控制器 在…上 self.revelView控制器 可以解决黑屏问题。

    编辑:

    尝试如下:

    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];
        ....
    
        3
  •  0
  •   Rahul    9 年前

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

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

    不要使用此而不是使用此:

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