【问题标题】:How to perform a segue with a programmatically loaded storyboard?如何使用以编程方式加载的故事板执行转场?
【发布时间】:2012-02-04 02:47:55
【问题描述】:

我需要从我的故事板上执行一个转场。在这种情况下调用的方法是-[UIViewController performSegueWithIdentifier:sender:]。此方法依赖于UIViewControllerstoryboard 属性来查找情节提要(以及转场)。

但是,当 UIViewController 不是从情节提要创建时,不会设置 storyboard 属性。由于它是只读的,因此我无法在加载情节提要的位置以编程方式对其进行设置。

所以问题是:如何从以编程方式加载的故事板执行转场?

如果不可能,那可能是因为我的架构不正确。这是用例:

该应用是旧版标签栏应用程序,其中 8 个标签中的每一个都有自己的 NIB 文件。 8 个选项卡中的许多选项卡都相当复杂,并且可以从情节提要中受益匪浅,尤其是原型表单元格和静态表。所以我想改进应用程序以使用故事板。

然而,一个巨大的故事板似乎不是一个好主意:它会阻止对应用程序的增量更改,它会很笨重,它会使团队成员难以独立处理他们的标签。

正确的模块化水平似乎让UITabBarController 拥有自己特定的故事板。这使得每个选项卡都可以按照自己的节奏发展,并使每个开发人员更容易在他们的选项卡上工作,几乎没有源代码控制冲突。

到目前为止,我的方法是包含 UITabBarController 及其每个主要子视图控制器的主 nib 文件。子视图控制器从他们的viewDidLoad 方法加载他们的故事板。从那里,他们无法执行他们的转场。

另一种方法是从故事板创建子视图控制器,但是我怎样才能将它们连接到UITabBarController?我在哪里以编程方式加载情节提要?

感谢您的任何建议。

【问题讨论】:

标签: cocoa-touch ios5 uitabbarcontroller storyboard


【解决方案1】:

在 segue 上进行引用并将指针值保存在单例类中。然后使用保存在单例类中的指针引用,在任何你喜欢的地方访问 segue 并加载它。这是一个示例代码,我在其中从单个故事板类加载 segue 视图,但每个视图都有单独的视图控制器 .h 和 .m 文件,它们具有适当的连接。 (我使用了正式的协议,因此行 shareVC.delegate = self; 存在。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) {
if (self.currentPopover != nil) {
[_currentPopover dismissPopoverAnimated:YES];
 self.currentPopover = nil;
}

    UIStoryboardPopoverSegue *popSegue = (UIStoryboardPopoverSegue *)segue;
    self.currentPopover = popSegue.popoverController;
}

if ([segue.identifier compare:@"ShareModal"] == NSOrderedSame) {
    //the share controller is being presented modally, probably iphone

    UINavigationController *shareNavController = segue.destinationViewController;
    myViewController *shareVC = (myViewController *)[shareNavController topViewController];

    shareVC.delegate = self;


}  else if ([segue.identifier compare:@"SharePopover"] == NSOrderedSame) {


    FollowersViewController *followerVC = segue.destinationViewController;
    followerVC.delegate = self;



}  else if ([segue.identifier compare:@"StartScreenSegue"] == NSOrderedSame) {

UINavigationController *startNavController = segue.destinationViewController;
StartViewController *startVC = (StartViewController *)startNavController.topViewController;
startVC.delegate = self;
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationOpenUrlNotification object:nil];
    }
}

希望这会有所帮助:)

【讨论】:

  • “在 segue 上做参考”正是问题所在。如果我能做到这一点,视图控制器可以在需要时做到这一点。此外,我看不出单身人士会提供什么价值。此外,我有很多 segue,所以需要大量的单例!此外,无论如何,单身人士都是邪恶的。
  • 我已经使用 UITabBarController 上的一个类别以某种通用的方式解决了这个问题。我的解决方案可能值得在某处发布。我会在周末写出来
  • 请在此处提及链接。顺便一提 。好问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多