【问题标题】:Using same UIViewController in Multiple Storyboards在多个故事板中使用相同的 UIViewController
【发布时间】:2015-07-07 10:10:44
【问题描述】:

我现在正在开发的 iOS 应用中存在三种类型的用户,用户类型如下所列:

  • 标准用户
  • 团队负责人
  • 董事会成员

由于用户的功能可能不同,我认为在应用程序中拥有三个故事板是有意义的,每个故事板都包含当前登录用户的各自流程。因此,故事板将是:

  • 标准用户故事板
  • 团队负责人故事板
  • 董事会成员故事板

到目前为止,一切都很好!

现在,我有一个 TasksViewController 负责显示特定于当前登录用户的任务,这个 View Controller 是在 XIB 中创建的。 TasksViewController 提供了一个通用功能,我认为我应该能够在所有故事板中使用 TasksViewController。

问题是:

  • 这是正确的做法吗?
  • 如果这是正确的做法,是否可以这样做?
  • 如果可能,如何实现?

【问题讨论】:

  • 很确定您要问的是您是否可以看到嵌入在所有三个故事板中的 XIB 中的设计。几乎可以肯定这是不可能的。
  • @SteveMadsen,明白了!这就是我所要求的。不确定我所要求的是否是作为故事板功能要求的东西,但至少对我来说这听起来合乎逻辑。
  • 我同意它可能非常有用。您应该提交增强或新功能请求Radar,然后,如果您要参加 WWDC,可能会去实验室并与 Xcode 工程师讨论一下。

标签: ios uiviewcontroller storyboard uistoryboard xib


【解决方案1】:
  • 这是正确的做法吗?

这取决于您的全球项目。请记住,您的建议是可能的,但会使代码难以理解/调试 .确实,假设您通过从 XIB 手动实例化控制器来推送控制器,如何处理来自该控制器的 segue(假设 segue 必须根据用户类型具有不同的行为)?根据用户类型切换segue?如果太频繁的话会很丑..

  • 可以这样做吗?如何实现?

当然可以。例如,创建一个专用于共享组件的故事板,并在需要时on-the-fly实例化控制器(用 Swift 编写的 sn-p,在 Objective-C 中的方法相同)。

let sharedStoryboard: UIStoryboard = UIStoryboard(name: "SharedStoryboard", bundle: NSBundle.mainBundle())
let sharedController: UIViewController = sharedStoryboard.instantiateViewControllerWithIdentifier("ControllerIdentifier") as! UIViewController
self.navigationController?.presentViewController(sharedController, animated: true, completion: nil)

这将实例化包含在您的共享故事板中的控制器并将其呈现给用户。这是老方法,但在处理多个故事板时,这是最好的解决方案。

  • 那该怎么办?

如果您只有几个控制器,我建议您为每个用户复制它 - 如果您需要在控制器上添加 用户类型特定 功能,将来也会更容易.如果您的应用程序的很大一部分是共享的,请使用上面介绍的方式。

希望这会有所帮助!

【讨论】:

  • 以您建议的方式呈现TasksViewController 是有意义的,并且肯定会起作用,但是,TasksViewController 不会出现在 Xcode 的情节提要设计界面中。我只是想知道是否有一种方法可以在多个故事板中显示TasksViewController
【解决方案2】:

是的,您可以这样做。而且我认为重用相同的 ViewController 很好。另一种方法是使用 Storyboard 来保存所有可重用的视图控制器并通过标识符重用 ViewController。

这是使用 xib 的解决方案:

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"TaskController"
                                                      owner:self
                                                    options:nil];

TaskController *tasks = (TaskController *)[nibViews objectAtIndex:0];

// Do the stuff you want here

为了完整起见,这里是重用情节提要中的视图控制器:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:[NSBundle mainBundle]];
TaskController *nextOpportunity = [sb instantiateViewControllerWithIdentifier:@"YourIdentifier"];

【讨论】:

    猜你喜欢
    • 2012-09-30
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2012-12-16
    • 2016-07-15
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多