如何使用以编程方式加载故事板来执行segue?

时间:2012-01-06 10:53:23

标签: cocoa-touch ios5 uitabbarcontroller storyboard

我需要从故事板中执行一个segue。在这种情况下调用的方法是-[UIViewController performSegueWithIdentifier:sender:]。此方法依赖于storyboard的{​​{1}}属性来查找故事板(因此也就是segue)。

但是,如果未从故事板创建UIViewController,则不会设置storyboard属性。由于它是只读的,我无法以编程方式在我加载故事板的地方设置它。

所以问题是:如何从已经以编程方式加载的故事板中执行segue?

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

该应用程序是一个传统的tabbar应用程序,其中8个选项卡中的每一个都有自己的NIB文件。 8个选项卡中的许多都相当复杂,并且可以从故事板中获益很多,尤其是原型表单元格和静态表格。所以我想改进应用程序以使用故事板。

然而,一个庞大的故事板似乎不是一个好主意:它会阻止对应用程序的增量更改,这将是笨拙的,这将使团队成员难以独立地在其选项卡上工作。

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

到目前为止,我的方法是包含UITabBarController及其每个主要子视图控制器的主nib文件。子视图控制器从他们的UITabBarController方法加载故事板。从那里开始,他们就无法表现出色。

替代方案是从故事板创建子视图控制器,但是如何将它们连接到viewDidLoad?我在哪里以编程方式加载故事板?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

在segue上创建一个引用并将指针值保存在单例类中。然后使用保存在singleton类中的指针引用,在任何你喜欢的地方访问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];
    }
}

希望这会有所帮助:)