我需要从故事板中执行一个segue。在这种情况下调用的方法是-[UIViewController performSegueWithIdentifier:sender:]
。此方法依赖于storyboard
的{{1}}属性来查找故事板(因此也就是segue)。
但是,如果未从故事板创建UIViewController
,则不会设置storyboard
属性。由于它是只读的,我无法以编程方式在我加载故事板的地方设置它。
所以问题是:如何从已经以编程方式加载的故事板中执行segue?
如果不可能,那可能是因为我的架构不正确。以下是用例:
该应用程序是一个传统的tabbar应用程序,其中8个选项卡中的每一个都有自己的NIB文件。 8个选项卡中的许多都相当复杂,并且可以从故事板中获益很多,尤其是原型表单元格和静态表格。所以我想改进应用程序以使用故事板。
然而,一个庞大的故事板似乎不是一个好主意:它会阻止对应用程序的增量更改,这将是笨拙的,这将使团队成员难以独立地在其选项卡上工作。
正确的模块化水平似乎让UIViewController
拥有自己的特定故事板。这使得每个选项卡都可以按照自己的进度发展,并使每个开发人员更容易在其选项卡上工作,几乎没有源控制冲突。
到目前为止,我的方法是包含UITabBarController
及其每个主要子视图控制器的主nib文件。子视图控制器从他们的UITabBarController
方法加载故事板。从那里开始,他们就无法表现出色。
替代方案是从故事板创建子视图控制器,但是如何将它们连接到viewDidLoad
?我在哪里以编程方式加载故事板?
感谢您的任何建议。
答案 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];
}
}
希望这会有所帮助:)