【问题标题】:instantiateViewControllerWithIdentifier and pass datainstantiateViewControllerWithIdentifier 并传递数据
【发布时间】:2013-03-27 19:06:48
【问题描述】:

我在我的应用程序中使用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];




    }

【问题讨论】:

  • 我在这篇文章中没有看到解决方案。我正在使用实例化控制器,因为我不使用 segue。那么如果没有segue,我还能使用prepareforsegue吗?
  • 视图控制器的实例化位置不应改变您向其传递消息的方式。
  • 如果实例化的控制器是导航控制器,我该如何传递数据?
  • 听起来你在问类似“我正在使用instantiateViewControllerWithIdentifier:从情节提要加载UINavigationController。导航控制器内部是一个表格视图控制器。记住我是不使用 segue,我如何将数据传递给表格视图控制器,并显示导航控制器?”对吗?

标签: ios storyboard segue


【解决方案1】:

如果实例化一个navigationController,可以使用viewControllers属性获取navigation controller的内部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];

【讨论】:

  • 你成功了。非常感谢。有了这个提示,我发现 UINavigationController 有一个名为 topViewController 的属性。非常感谢。两种方式都像魅力一样工作。我已经用另一种方式编辑了你的答案。
【解决方案2】:
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,那么我认为您需要重新考虑您的应用设计。

【讨论】:

  • newTopViewController 是 NavigationController 但我想将数据传递给我的 secondTableViewController。
  • 如果我说 newTopViewController.title = @"Whatever";标题不会改变,因为 secondTableviewController 是用导航栏显示的。如果我直接实例化 secondTableViewController,我可以传递像 secondTableViewController.title = @"Whatever" 这样的数据,但我的 tableview 中没有导航栏。
【解决方案3】:

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

因此,当您决定不使用 segue 时,您就失去了实例化新控制器并使用它传输数据的舒适新方法,您必须分两个不同的步骤进行控制和数据的传输。当您在情节提要中实例化另一个场景时(就像您使用 instantiateViewControllerWithIdentifier 一样:),您只是实例化了一个新控制器并传输了控制但没有传输数据。当您以旧方式从 xib 实例化一个新控制器时,请考虑一下(因此您必须在第二个视图控制器中使用 initWithCoder: 或 awakeFromNib,因为情节提要不会调用 initWithName:bundle:),但没有做任何其他事情.

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

所以你想做一些事情并且你需要来自上一个故事板(ViewController)的数据。您需要将这些数据提供给第二个故事板(ViewController),并且您知道有很多解决方案,甚至在故事板存在之前很长时间就可以使用。

所以关于您的代码,“数据传输”取决于您的设计,这两个控制器是彼此的子类还是其他...

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

secondViewControllerdata = firstViewControllerdata.thatDataProperty

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

【讨论】:

    【解决方案4】:

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

    @property (assign) int param1;

    @property (retain) NSMutableArray *param2;

    并使用以下传递数据:

    [newTopViewController setParam1:XX];

    [newTopViewController setParam2:XX];

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      相关资源
      最近更新 更多