如何将 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
块内的会话中设置值并在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];
....
【讨论】:
当我设置@['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 传递给另一个视图的主要内容,如果未能解决你的问题,请参考以下文章