我在xcode 3中将项目作为“选项卡式应用程序”重新启动,以便在Interface Builder中设置标签栏。
现在我有充分的理由以编程方式创建标签栏窗口。
我已经阅读了很多东西,并设法用编码标签栏创建一个新项目,所有这些都很好。因此,我相信我了解如何基于新的“空应用程序”从头开始创建标签栏项目(我认为在xcode 3中称为“基于窗口的应用程序”)。
然而,当我尝试将该代码应用于我作为“选项卡式应用程序”启动的正在进行的项目时,我总是得到:“应用程序在应用程序启动结束时应该在调试控制台上有一个根视图控制器” 。
我需要做些什么才能将项目类型从“选项卡式应用程序”回溯到“空应用程序”? 或者是从头开始新项目并从旧文件复制所有源文件的唯一方法?
BTW:谷歌搜索错误消息引导我到这个优秀的线程: Applications are expected to have a root view controller at the end of application launch
不幸的是,所提出的解决方案都不适用于我。这就是为什么我认为我的问题从一开始就与不同类型的项目有关。
编辑:我被要求提供didFinshWithLaunching代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranslucent];
#ifdef FREE
window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.tabBarController = [[[FcTabBarController alloc] init] autorelease];
VotingMenuTVC *vc0 =[[[VotingMenuTVC alloc] initWithNibName:@"VotingMenuTVC" bundle:nil] autorelease];
ChannelsTVC *vc1 =[[[ChannelsTVC alloc] initWithNibName:@"ChannelsTVC" bundle:nil] autorelease];
NSArray* controllers = [NSArray arrayWithObjects:vc0, vc1, nil];
tabBarController.viewControllers = controllers;
// Add the tab bar controller's current view as a subview of the window
float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
if (ver >= 4.0) {
self.window.rootViewController = self.tabBarController;
} else {
[window addSubview:[tabBarController view]];
}
[window addSubview:[tabBarController view]];
NSLog(@"RootViewController: %@",self.window.rootViewController);
NSLog(@"TabBarController: %@",self.tabBarController);
#else
float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
if (ver >= 4.0) {
self.window.rootViewController = self.tabBarController;
} else {
[window addSubview:[tabBarController view]];
}
#endif
[self.window makeKeyAndVisible];
return YES;
}
对于当前Target,设置了编译器宏“FREE”。否则它将编译为MainWindow.xib仍然存在的另一个targent(并且工作正常)。目前MainWindow.xib仍然是Boundle的一部分,甚至是设置FREE的那个。但它未在目标的plist文件中设置为主界面。主界面为空白。
根据NSLog语句(和调试分析),toolBarController属性很好,但是窗口的rootViewController是nil,我不明白。
由于Firoze Lafeer有一个问题,要求MainWindow.xib仍然存在,这是我将改变的nex事情。我稍后会根据结果更新这篇文章。
答案 0 :(得分:2)
无需从头开始。如果要在应用程序委托中创建UITabBarController,则需要确保将其设置为窗口的根视图控制器。由于UITabBarController是UIViewController的子类,因此您可以非常轻松地完成此任务!
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Start creating your UITabBarController and set it up here:
UITabBarController *tabBarController;
// Finish creating your UITabBarController here
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
最好将tabBarController
作为一个属性。
答案 1 :(得分:0)
答案是......我不知道。项目设置或plist或其他任何东西都有其他错误。
最后我吃了它并从头开始了一个新项目。 (因此,我抓住机会识别出我发现错误的其他零碎碎片,并且在那次机会中我改为ARC。)
所以我复制了所有来源:* .h,*。m,*。xib,* .png但没有plist等(我还没有任何本地化字符串,但如果我有,那么我将它们复制为嗯,当然) 但是我没有复制从原始项目中删除的MainWindow.xib。
最后,didFinishLanuchingWithOptions方法一点也不奇怪:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranslucent];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
FcTabBarController *localTabBarConroller = [[FcTabBarController alloc] init];
self.tabBarController = localTabBarConroller;
NSArray* controllers;
UserCentralVC *vc1 =[[UserCentralVC alloc] initWithNibName:@"UserCentralVC" bundle:nil user:nil userId:nil];
ChannelsTVC *vc0 =[[ChannelsTVC alloc] initWithNibName:@"ChannelsTVC" bundle:nil] ;
AppMenuTVC *vc3 =[[AppMenuTVC alloc] initWithNibName:@"VotingMenuTVC" bundle:nil] ; //Re-Use another similar nib file.
UINavigationController* vnc0 = [[UINavigationController alloc] initWithRootViewController:vc0];
UINavigationController* vnc1 = [[UINavigationController alloc] initWithRootViewController:vc1];
UINavigationController* vnc3 = [[UINavigationController alloc] initWithRootViewController:vc3];
#ifdef FREE
controllers = [NSArray arrayWithObjects:vnc0, vnc1, vnc3, nil];
#else
VotingMenuTVC *vc2 =[[VotingMenuTVC alloc] initWithNibName:@"VotingMenuTVC" bundle:nil] ;
UINavigationController* vnc2 = [[UINavigationController alloc] initWithRootViewController:vc2];
controllers = [NSArray arrayWithObjects:vnc0, vnc1, vnc2, vnc3, nil];
#endif
self.tabBarController.viewControllers = controllers;
// Add the tab bar controller's current view as a subview of the window
float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
if (ver >= 4.0) {
self.window.rootViewController = self.tabBarController;
} else {
[self.window addSubview:[self.tabBarController view]];
}
[self.window makeKeyAndVisible];
return YES;
}
感谢所有帮助过的人。即使解决方案没有直接出现在银盘上,有时也很有帮助。
向大家致以节日的问候!