实例化ViewControllerWithIdentifier并传递数据

我在我的应用程序中使用Storyboard ,我想将数据从一个视图传递到另一个视图。

而不是使用segues我使用instantiateViewControllerWithIdentifier 。 在这种情况下,我从我的第一个TableViewController实例化到一个NavigationController有第二个TableViewController附加,因为我需要在第二个TableViewController导航。 现在我想从我的第一个TableviewController ,根据哪一行被点击数据传递到我的第二个TableviewController 。 在这种情况下newTopViewController将是我的NavigationController但我的问题是现在如何将数据从firstTableViewController传递到第二个secondTableviewController

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSString *identifier = [NSString stringWithFormat:@"%@Top", [menuArray objectAtIndex:indexPath.row]]; UIViewController *newTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; } 

在这里输入图像说明

如果你实例化一个navigationController,你可以使用viewControllers属性来获取导航控制器的内部viewController。

像这样的东西:

 UINavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; MBFancyViewController *viewController = navigationController.viewControllers[0]; // setup "inner" view controller viewController.foo = bar; [self presentViewController:navigationController animated:YES completion:nil]; 
 newTopViewController.anyVariableToShow= anyVariableToSend; 

我经常在我的几个应用程序上做这个…

//创build新的VC

 CookViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CookVC"]; //Set recipe [detailViewController setRecipe:recipe]; //Pop over VC (can be pushed with a nav controller) [self presentPopupViewController:detailViewController animationType:MJPopupViewAnimationFade]; 

如果您没有使用导航控制器或继续使用,那么我认为您需要重新考虑您的应用程序devise。

其实这不仅仅是一个数据传递的问题,因为这是一个程序控制和数据传输问题。 即使你不得不重新思考你的应用程序的概念,因为你想使用故事板没有故事板的含义,这取决于你,我希望你有充足的理由做你做的事情。

所以当你决定不使用segue的时候,你就失去了实例化一个新的控制器和传输数据的新的,舒适的方法,你必须在两个不同的步骤中进行控制和数据的传输。 当你在storyboard中实例化另一个场景(就像你使用instantiateViewControllerWithIdentifier :)你刚刚实例化一个新的控制器,并传递控制,但不是数据。 当你以旧的方式从xib实例化一个新的控制器的时候,考虑一下(所以你必须在第二个视图控制器中使用initWithCoder:或awakeFromNib,因为storyboard不会调用initWithName:bundle :),但是没有做更多的事情。

所以你将有一个新的控制器(它在第二个故事板的标识部分命名)挂在宇宙中,与其他任何东西没有任何关系或联系(如故事板图片很好地说明),你可以用它做什么我喜欢。

所以你想做一些事情,你需要从以前的故事板(视图控制器)的数据。 你需要的是将这些数据提供给第二个故事板(ViewController),并且如你所知,有很多解决scheme可以在故事板存在之前很长时间使用。

所以关于你的代码,“数据传输”取决于你的devise,两个控制器是否是彼此的子类或者是什么…

如果你不喜欢处理子类化,并想尽可能地解耦它们,最好的办法就是在第一个控制器中创build数据属性,并从第二个控制器中引用它们(在导入第一个.h文件之后)只需在它的viewDidLoad或initWithCoder中引用它:或者在你需要它的任何地方

 secondViewControllerdata = firstViewControllerdata.thatDataProperty 

当然你也可以在第二个控制器中做相同的操作,并在第一个控制器中引用它。

你可以在UIViewController中定义一些参数来接收数据:

@属性(分配)int param1;

@属性(保留)NSMutableArray * param2;

并使用下面的数据传递:

[newTopViewController setParam1:XX];

[newTopViewController setParam2:XX];