Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过UITabBarController打开新故事板的正确方法_Ios_Objective C - Fatal编程技术网

Ios 通过UITabBarController打开新故事板的正确方法

Ios 通过UITabBarController打开新故事板的正确方法,ios,objective-c,Ios,Objective C,我们正在将我们的主情节提要拆分为更小的情节提要,以便使源代码管理合并更容易。有没有关于从UITabBar加载新故事板的正确方法的想法 以下是我们到目前为止在自定义子类UITabBarController中的内容: UITabBarItem *cardsTabItem = [self.tabBar.items objectAtIndex:kTabBarIndexCards]; cardsTabItem.image = [[UIImage imageNamed:@"navCardsOff"

我们正在将我们的主情节提要拆分为更小的情节提要,以便使源代码管理合并更容易。有没有关于从UITabBar加载新故事板的正确方法的想法

以下是我们到目前为止在自定义子类UITabBarController中的内容:

UITabBarItem *cardsTabItem = [self.tabBar.items objectAtIndex:kTabBarIndexCards];

    cardsTabItem.image = [[UIImage imageNamed:@"navCardsOff"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    cardsTabItem.selectedImage = [[UIImage imageNamed:@"navCardsOn"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    cardsTabItem.imageInsets = UIEdgeInsetsMake(-5, 0, 5, 0);
    cardsTabItem.titlePositionAdjustment = UIOffsetMake(0, -5);

我以前也做过同样的事情,但用的是一个超宽带控制器。在这种情况下,每个选项卡按钮都有一个情节提要,即使其中一个情节提要中只有一个视图控制器。我认为无论您使用的是UIDABBarController还是响应选项卡栏委托,答案都是一样的。对于单击的每个按钮,确定要加载的视图控制器位于哪个情节提要中:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"leftButtonStoryboard" bundle:[NSBundle mainBundle]];
UIViewController *vc = [storyboard instantiateInitialViewController];

//or

UIStoryboard *otherVC = [storyboard instantiateViewControllerWithIdentifier:@"CameraViewController"];
然后你可以展示它,推它,或者其他什么

在我的例子中,因为我使用的是UITabBarController,所以这一切都是在控制器初始化期间为所有不同的按钮完成的

默认情况下,命名故事板中使用的所有不同的视图控制器(故事板id)很可能很方便,我通常以viewController类的名称命名它们,这样我就不必记得我叫它什么了

我还建议您在尝试实例化另一个视图控制器时避免使用self.storyboard属性,因为最终可能会出现在选项卡之间共享控制器的情况。明确从哪个故事板加载控制器有助于提高可读性和避免bug

编辑-一个更具体的示例:

您需要做的是设置UITabViewController的viewControllers属性,我在它的init方法中这样做。比如说

- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    UIViewController *one = [mainStoryboard instantiateViewControllerWithIdentifier:@"VC1"];
    UIViewController *two = [mainStoryboard instantiateViewControllerWithIdentifier:@"VC2"];

    self.viewControllers = @[one,two];
    }
return self;
}
如果您使用代码本身编写它,或者如果您使用的是故事板,则可以使用此技术。请注意,如果您已经通过故事板连接了其他视图控制器,那么您将松开它们,除非您也在那里实例化它们。也可以使用setViewController:animated:方法


用于创建自定义选项卡栏项(底部的按钮)的代码可能应位于各个视图控制器中,并指定给其tabBarItem属性。UITabBarController将使用该属性创建样式正确的按钮。如果您不提供属性,您将获得从1开始的默认按钮。

很抱歉,我们实际上正在子类化UITabBarController。您能否显示用于使其在子类控制器中工作的代码?也许我的大脑今天不工作了,但我似乎不知道如何在不使应用程序崩溃的情况下添加选项卡栏项。非常感谢。更新了一个更具体的例子。如果你需要一个更好的例子,我可以推一个样本项目