【问题标题】:How to reference a ViewController in storyboard with PresentViewController如何使用 PresentViewController 在情节提要中引用 ViewController
【发布时间】:2014-03-31 08:19:24
【问题描述】:

我在 UITabBarViewController 中有四个选项卡。每个视图的导航栏都添加了 UIButton,每个选项卡都有一个“发布按钮”,可以将用户带到发布页面。

如何引用已经位于我的故事板中的 ViewController,以便我可以将其传递给 PresentViewController: 方法?

例如,这是从四个标签栏视图中的任何一个单击发布按钮时使用的方法:

- (void)postInvoked:(UIBarButtonItem *)sender
{
    [self presentViewController:______ animated:YES completion:nil];
}

空白处是什么?我想我需要避免像这样引用 UIViewController:

UIViewController * postPage = [[UIViewController alloc] init];

因为这会在用户每次导航到页面时创建一个新的页面实例。

【问题讨论】:

  • 您是否需要每次都转到同一个实例(该控制器中是否有您希望在从不同选项卡呈现数据之间保留的数据)?
  • 为您的 viewController 设置 storyBoardId,然后使用“instantiateViewControllerWithIdentifier”进行展示或推送。

标签: ios objective-c xcode


【解决方案1】:

您必须创建要呈现的控制器实例:

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
UIViewController *controller = [mainStoryboard instantiateViewControllerWithIdentifier: @"<Controller ID>"];

这将使用来自故事板的预配置视图创建控制器。

@"Controller ID" == Interface Builder 中的 "Storyboard ID" 属性。 (选择控制器时的检查器选项卡)

随心所欲地呈现。

[self presentViewController:controller  animated:YES completion:nil];

【讨论】:

  • 如果我想简单地从多个类中引用 UIViewController,我应该把这个实例放在哪里。它应该在 AppDelegate 中吗?我想从多个类中调用 PresentViewController:,所以我不想重新创建对 VC 的引用。
  • 我想我要问的是..是否有必要使用您在每个 UIViewController 中提供的前两行,这将需要遍历到实例化的 VC,或者应该在某处声明喜欢 AppDelegate?
  • 这取决于你的应用逻辑。默认行为是您在拥有的每个 UIViewController 中创建。我不认为您的意图是创建一次并展示它,但如果是这样,您可以在 AppDelegate 中创建一次。
  • 如果你只想保留一个实例,你应该使用singleton pattern。因此,您的 VC 将在整个应用程序中可用,而无需将其保留在应用程序委托中。
  • 谢谢哥们。我只是从每个类中的每个调用创建它的一个实例。不过,我很欣赏单例链接。我不知道。
【解决方案2】:

视情况而定。

不存在“坐在故事板中”的 VC。这只是一个模板,可让您在需要时创建 VC 的新副本。

如果您已经在内存中拥有此 VC 的副本,只需在调用中将指针 t 传递给 presentViewController:animated

如果没有,则需要在storyboard中给它一个唯一的ID,然后使用UIStoryboard方法instantiateViewControllerWithIdentifier:创建VC的实例,然后将新创建的VC的指针传递给presentViewController:animated

【讨论】:

  • 但是 UIViewController 的引用应该去哪里呢? AppDelegate?或 tabBarVC 的每个 VC 内部。我想确保当我从每个 tabVC 调用 presentViewController: 时,它使用相同的引用。
【解决方案3】:

1) 在故事板中,单击要显示的视图控制器,然后在实用程序窗格中,单击身份检查器。

2) 在故事板 ID 中输入任意字符串,例如“postView”。

3) 将方法编辑为:

- (void)postInvoked:(UIBarButtonItem *)sender
{
    [self presentViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"postView"] animated:YES completion:nil];
}

换句话说:

假设你添加了storyboard ID,空白处应该填写

[self.storyboard instantiateViewControllerWithIdentifier:@"storyBoardIDHere"]

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多