Ios 如何使用XIB创建CustomTabBarController?

Ios 如何使用XIB创建CustomTabBarController?,ios,customization,uitabbar,Ios,Customization,Uitabbar,我正在使用iOS 5.1,我需要为我的应用程序创建一个自定义选项卡栏。当应用程序启动时,控件将被推送到自定义TabbBar控制器类。这就是我正在做的我已经创建了从UITabBarController派生的类,并且还使用了XIB。在XIB中,我可以看到包含选项卡栏的UIView对象,当我在该选项卡栏中添加更多选项卡时,当我运行应用程序时,它没有反映出来,我只能看到一个没有标题和颜色的黑色TabBar。我记得之前我们使用main window.xib添加TabBar控制器,对于每个TabBar项目,

我正在使用iOS 5.1,我需要为我的应用程序创建一个自定义选项卡栏。当应用程序启动时,控件将被推送到自定义TabbBar控制器类。这就是我正在做的我已经创建了从UITabBarController派生的类,并且还使用了XIB。在XIB中,我可以看到包含选项卡栏的UIView对象,当我在该选项卡栏中添加更多选项卡时,当我运行应用程序时,它没有反映出来,我只能看到一个没有标题和颜色的黑色TabBar。我记得之前我们使用main window.xib添加TabBar控制器,对于每个TabBar项目,我们添加导航控制器,以便每个选项卡都有自己的导航控制器,但如果我有,我不知道该怎么做使用了从UiTabBarController类派生的XIB。如果有任何不清楚的地方,请告诉我。我会作出更多澄清。我只想知道为什么XIB选项卡上的更改没有反映在应用程序中


下图显示了XIB和应用程序,因此您可以看到我在UITabBar中添加了四个选项卡,但在应用程序中只有一个黑条。

来自苹果公司关于UITabBarController的文档: 该类不用于子类化。相反,您可以按原样使用它的实例来呈现一个界面,允许用户在不同的操作模式之间进行选择

您不能将其子类化。如果原始UITabBarController没有您正在寻找的功能,那么您唯一的选择就是创建一个新的自定义选项卡栏控制器,而无需对原始选项卡栏控制器进行子类化

编辑:不确定是否要执行此操作。您只是想从nib加载UITabBarController吗?如果是这样,就不需要子类化。最好使用故事板;-)但你甚至可以用笔尖来做。 您只需执行以下操作:

1-向项目中添加一个空的xib,并将其称为TabBar(仅xib。无源文件)

2-在笔尖内放置一个UITabBarController。没有其他组件,只有那个UITabBarController

3-将此代码放入AppDelegate应用程序didFinishLaunchingWithOptions方法:

// this code should be already in that method if you have used the empty application model
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

// this is the new code to add. You are programmatically loading an instance of UITabBarController from the nib named TabBar.xib
UITabBarController *tb = (UITabBarController *)[[[NSBundle mainBundle]loadNibNamed:@"TabBar" owner:self options:nil] objectAtIndex:0];
// here you are assigning the tb as the root viewcontroller
self.window.rootViewController = tb;

// this code is standard in this method
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
然后,您可以自定义UITabBarController,它应该能够正确加载。 注意:如果在笔尖内添加其他对象,则必须更改线条

UITabBarController *tb = (UITabBarController *)[[[NSBundle mainBundle]loadNibNamed:@"TabBar" owner:self options:nil] objectAtIndex:0];

通过一个循环和一些检查,看看您是否真的加载了UITabBarController而不是其他组件。现在我只是在nib中加载第一个对象,而不关心它是UIAbbarController还是UIPotato;-)

你的意思是我不能创建一个从UITabBarController派生的类?不确定你的意思是“派生”。“您不能子类”的意思是,您不能创建这样的类:
@interface MyTabBarController:UITabBarController
不,我们可以这样做,我以前做过很多次,但我从未为此使用过XIB!事实上,你做到了并且工作了并不意味着:1-受支持(正如文档所说,不,它不受支持)2-它将在未来的iOS版本中继续工作。最近(iOS 6)苹果做了大量工作来完全避免这种定制(例如,在iOS 6上,你不能在横向旋转UIImagePickerController,即使在iOS 5上也可以,因为苹果增加了一些安全技巧)。我的消息来源是一名苹果员工;-)好的,在iOS 6上可能不可能,但是你能告诉我我的问题的解决方案吗?那就是我如何定制能够支持iOS 5和iOS 6的UITabBar。请让您的苹果员工给我发送一些示例代码!