instantiateViewControllerWithIdentifier并传递数据

时间:2013-04-05 11:25:36

标签: ios storyboard segue

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

我使用instantiateViewControllerWithIdentifier而不是使用segues。在这种情况下,我将从我的第一个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];




    }

enter image description here

4 个答案:

答案 0 :(得分:15)

如果实例化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];

答案 1 :(得分:5)

newTopViewController.anyVariableToShow= anyVariableToSend;

我经常在我的一些应用程序中这样做...

//创建新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];

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

答案 2 :(得分:0)

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

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

所以你将有一个新的控制器(它在第二个故事板的标识部分中命名),它挂在宇宙中,没有任何关系或与任何其他任何关系(因为故事板图片很好地说明了),你可以用这就是你想要的。

所以你想要做一些事情,你需要来自前一个故事板(ViewController)的数据。您需要的是将这些数据提供给第二个故事板(ViewController),如您所知,有很多解决方案可以在故事板存在之前很久就可用。

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

如果您不喜欢处理子类并且希望尽可能地将它们分离,那么最好的方法是在第一个控制器中创建数据属性并从第二个控制器中引用它们(在导入第一个控制器之后)。 h文件)并在它的viewDidLoad或initWithCoder中引用它:或者在你需要它们的任何地方引用它,如

secondViewControllerdata = firstViewControllerdata.thatDataProperty

当然你可以反过来做同样的事情并制作第二个控制器的属性并在你的第一个视图控制器中引用它。

答案 3 :(得分:0)

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

  

@property(assign)int param1;

     

@property(retain)NSMutableArray * param2;

并使用以下内容传递数据:

  

[newTopViewController setParam1:XX];

     

[newTopViewController setParam2:XX];