以编程方式创建 uiTabBarController

10

我想为UITabBarController创建一个UIView

以下是我的.h文件中的代码:

@interface TE : UIViewController <UITabBarControllerDelegate>{
    UITabBarController *tabBarController;
}
@property (nonatomic,retain) UITabBarController *tabBarController;
@end

viewDidLoad方法:

UIViewController *testVC = [[T1 alloc] init];
UIViewController *otherVC = [[T2 alloc] init];
NSMutableArray *topLevelControllers = [[NSMutableArray alloc] init];
[topLevelControllers addObject: testVC];
[topLevelControllers addObject: otherVC];
tabBarController = [[UITabBarController alloc] init];
tabBarController.delegate = self;
[tabBarController setViewControllers:topLevelControllers animated:NO];
tabBarController.selectedIndex = 0;
self.view = tabBarController.view;

这将创建一个选项卡栏控制器,但是当我单击选项卡栏中的项目时,会出现以下错误:

Thread1:程序接收到信号:SIGABRT

编辑:我通过下载和修改http://www.iphonedevcentral.com/create-uitabbarcontroller/的版本来解决了问题。


你在哪一行代码中收到了SIGABRT信号? - sergio
我在 main.m 文件中理解了这句代码:"return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));" - Mehdi
但是,sigabrt 将会在最开始触发;您将无法进入任何点击操作...AppDelegate 类是什么样子的? - sergio
AppDelegate类是空的,我没有添加任何内容,这是我添加的唯一代码。当我点击TabBarController中的项目时,会出现SIGABRT错误。 - Mehdi
你能提供从调试器中获取的堆栈跟踪吗?你可以通过在Xcode中显示控制台来获取它... - sergio
嗨,我也在尝试使用相同的方法将选项卡控制器添加到我的应用程序中。但是当我点击选项卡时,应用程序会崩溃。您能告诉我您是如何解决这个问题的吗?谢谢。 - tyegah123
5个回答

1
你在上面说不想在appDelegate中创建tabBarController,为什么?那你打算在哪里创建呢?tabBarController必须是根视图控制器,不能是任何其他视图控制器的子视图控制器。
顺便说一句,确保你实现了:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {

    NSUInteger tabIndex = [tabBarController.viewControllers indexOfObject:viewController];

    if (viewController == [tabBarController.viewControllers objectAtIndex:tabIndex] ) {
         return YES;
    }

    return NO;

}

我不想在AppDelegate中创建t,因为我将把这些类添加到已经在delegate中有tabbarcontroller的项目中。 - Mehdi
你正在尝试在已经有一个tabBarController的应用程序中创建一个tabBarController?你只能拥有一个tabBar。您应该访问那个已经存在的tabBar,而不是创建一个新的额外的tabBar。 - ader

1
  1. 子类化UITabBarController

  2. 覆盖- (void) loadView方法,并包含以下代码

    MyCustomViewControllerOne* ctrl1 = [[[MyCustomViewControllerOne alloc] initWithNibName@"MyViewControllerOne" bundle: nil] autorelease];
    UIViewController* ctrl2 = [[[UIViewController alloc] init] autorelease];
    MyCustomControllerTwo* ctrl3 = [[[UIViewController alloc] initWithObject: myObj] autorelease];
    
    ctrl1.title = @"第一个标签";
    ctrl2.title = @"第二个标签";
    ctrl3.title = @"第三个标签";
    
    ctrl1.tabBarItem.image = [UIImage imageNamed:@"tab_image1.png"];
    ctrl2.tabBarItem.image = [UIImage imageNamed:@"tab_image2.png"];
    ctrl3.tabBarItem.image = [UIImage imageNamed:@"tab_image3.png"];
    
    [self setViewControllers: @[ctrl1, ctrl2, ctrl3]];
    
这就是大部分内容。

1
我曾经在重写loadView方法时遇到了问题,但当我将它添加到viewDidLoad方法中时,这个方法对我很有效。 - Andrew Cross

0

@Mehdi,只需将您的TE设置为UITabBarController而不是UIViewController,然后在其中添加一个TabBarController即可更轻松地管理您的TabBarController。回应一些其他人指出您只能有一个TabBarController作为窗口的rootViewController。这并不是事实。可以在需要第二级菜单导航的多个位置实例化UITabBarController。在TabBar中再嵌套一个TabBar是没有意义的,但在每个菜单项上都有一个左侧导航菜单,然后有一个TabBar是有意义的。


0
self.view = tabBarController.view; 改为
[self.view addSubview:tabBarController.view]; 就可以正常工作了。

当我将 "self.view = tabbarcontroller;" 替换为 [self.view addSubview:tabBarController.view]; 时,屏幕仍然是黑色的,很奇怪 :( - Mehdi
真的很奇怪,我之前创建了测试项目并且它确实可以工作。如果没有代码,帮助可能会很困难。你正在使用xibs吗? - Michał Zygar

0
尝试更改:
self.view = tabBarController.view;

[self.view addSubview:tabBarController.view];
看看是否有帮助。
还可以尝试将此代码放置在您的-(void)loadView方法中。
- (void)loadView {

    UIView *mv = [[UIView alloc] initWithFrame:CGRectMake(0.0, 100.0, 320.0, 480.0)];

    self.view = mv;

    [mv release];
}

你可能会遇到黑屏问题,原因是你没有正确初始化你的 UIView。

当我将 "self.view = tabbarcontroller;" 替换为 [self.view addSubview:tabBarController.view]; 时,屏幕仍然是黑色的,很奇怪 :( - Mehdi
你能看到底部的tabBarController吗? - ms83
尝试像这样设置tabBarController框架:tabBarController.view.frame = CGRectMake(0, 0, 320, 460); - ms83
你实现了-(void)loadView方法吗? - ms83
我总是遇到黑屏问题,是的,我已经实现了它。 - Mehdi
好的,我已经用以下代码替换了loadview方法中的内容:"UIView *mv = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 1024, 768.0)]; self.view = mv;" 现在我可以看到tabbarcontroller了,但是当我点击其中一个项目时,出现了SIGABRT错误。 - Mehdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接