在多个故事板中使用相同的UIViewController

时间:2015-04-28 13:50:12

标签: ios uiviewcontroller storyboard uistoryboard xib

目前我正在使用的iOS应用中有三种类型的用户,用户类型列在下面:

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

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

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

到目前为止,非常好!

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

问题是:

  • 这是正确的做法吗?
  • 如果这是正确的事情,是否可以这样做?
  • 如果可行,如何实施呢?

2 个答案:

答案 0 :(得分:1)

  • 这是正确的做法吗?

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

  • 有可能这样做吗?如何实施?

当然可以。例如,创建一个专用于共享组件的故事板,并在需要时实例化控制器即时(用Swift编写的片段,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)

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

  • 那该怎么办?

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

希望这有帮助!

答案 1 :(得分:1)

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

以下是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"];