7

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

我没有使用 segues,而是使用instantiateViewControllerWithIdentifier. 在这种情况下,我从我的第TableViewController一个实例化到附加NavigationController了第二个的 a,TableViewController因为我需要在第二个中进行导航TableViewController。现在我想将数据从我的第一个TableviewController(取决于点击了哪一行)传递到我的第二个TableviewController。在这种情况下newTopViewController将是我的NavigationController,但我现在的问题是如何将数据firstTableViewControllersecondTableviewController.

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


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




    }

在此处输入图像描述

4

4 回答 4

17

如果你实例化一个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];
于 2013-04-07T07:35:03.597 回答
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,那么我认为您需要重新考虑您的应用程序设计。

于 2013-04-05T12:02:01.923 回答
0

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

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

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

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

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

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

secondViewControllerdata = firstViewControllerdata.thatDataProperty

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

于 2013-04-07T13:41:26.417 回答
0

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

@property(分配)int param1;

@property(保留)NSMutableArray *param2;

并使用以下传递数据:

[newTopViewController setParam1:XX];

[newTopViewController setParam2:XX];

于 2016-12-22T21:15:44.913 回答