首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >instantiateViewControllerWithIdentifier和pass数据

instantiateViewControllerWithIdentifier和pass数据
EN

Stack Overflow用户
提问于 2013-04-05 19:25:36
回答 4查看 16.4K关注 0票数 7

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

我使用的是instantiateViewControllerWithIdentifier,而不是segues。在本例中,我从第一个TableViewController实例化到一个附加了第二个TableViewControllerNavigationController,因为我需要第二个TableViewController中的导航。现在,我想将数据从第一个TableviewController传递到第二个TableviewController,具体取决于单击了哪一行。在本例中,newTopViewController将是我的NavigationController,但我现在的问题是如何将数据从firstTableViewController传递到secondTableviewController

代码语言:javascript
运行
复制
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *identifier = [NSString stringWithFormat:@"%@Top", [menuArray objectAtIndex:indexPath.row]];


        UIViewController *newTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:identifier];




    }

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-07 15:35:04

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

如下所示:

代码语言:javascript
运行
复制
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];
票数 17
EN

Stack Overflow用户

发布于 2013-04-05 20:02:02

代码语言:javascript
运行
复制
newTopViewController.anyVariableToShow= anyVariableToSend;

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

//新建VC

代码语言:javascript
运行
复制
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];

如果你没有使用导航控制器或segues,那么我认为你需要重新考虑你的应用程序设计。

票数 5
EN

Stack Overflow用户

发布于 2013-04-07 21:41:26

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

因此,当您决定不使用segue时,您就失去了实例化新控制器并使用它传输数据的新的、舒适的方法,您必须在两个不同的步骤中完成控制和数据的传输。当您在storyboard中实例化另一个场景时(就像您对instantiateViewControllerWithIdentifier:所做的那样),您只是实例化了一个新的控制器并传输了控件,但没有传输数据。可以这样想:您用旧方法从xib实例化了一个新控制器(因此,您必须在第二个视图控制器中使用initWithCoder:或awakeFromNib,因为故事板不会调用initWithName:bundle:),但没有做更多的事情。

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

所以你想做一些事情,你需要来自上一个故事板(ViewController)的数据。你需要的是将这些数据提供给第二个故事板(ViewController),正如你所知道的,在故事板出现之前很长一段时间内,就已经有很多解决方案了。

因此,关于你的代码,“数据传输”取决于你的设计,这两个控制器是彼此的子类还是其他什么……

如果您不喜欢处理子类化,而是希望尽可能地将它们解耦,那么最好的方法就是在第一个控制器中为数据创建一个属性,并在第二个控制器中引用它们(在导入第一个控制器的.h文件之后),然后在它的viewDidLoad或initWithCoder中引用它:或者在需要它们的任何地方,如下所示

代码语言:javascript
运行
复制
secondViewControllerdata = firstViewControllerdata.thatDataProperty

当然,您也可以反过来做同样的事情,为第二个控制器创建一个属性,并在第一个视图控制器中引用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15832706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档