我的UITabBarController没有出现,但它的第一个视图是?

时间:2010-03-11 23:18:12

标签: iphone objective-c cocoa-touch

我最近对我的项目做了一些重组,现在我没有看到我的标签栏控制器,但它的第一个视图控制器的视图正在出现。以下是问题发生之前发生的所有事情的细分。

App Delegate使用nib加载FirstViewController。 FirstViewController从我的服务器加载应用程序数据,然后向MainViewController提供模态转换。 MainViewController是UITabBarController应该出现的地方。这是一个非常简单的课程。

.h

@interface MainViewController : UIViewController <UITabBarControllerDelegate> {
    IBOutlet UITabBarController *tabBarController;
}

@property (nonatomic, retain) UITabBarController *tabBarController;

@end

.m

@implementation MainViewController
@synthesize tabBarController;

- (void)viewDidLoad {
NSLog(@"MainViewController viewDidLoad");


//set tab bar controller delegate to self
tabBarController.delegate = self;

// home view
HomeViewController *home = [[HomeViewController alloc] initWithTab];

// menu view 
MenuViewController *menu = [[MenuViewController alloc] initWithTab];

// special offers view 
SpecialOffersViewController *so = [[SpecialOffersViewController alloc] initWithTab];

// events view 
EventsViewController *events = [[EventsViewController alloc] initWithTab];

// info view 
InfoViewController *info = [[InfoViewController alloc] initWithTab];

//populate the tab bar controller with view controllers
NSArray *controllers = [NSArray arrayWithObjects:home, menu, so, events, info, nil];

tabBarController.viewControllers = controllers;

//release view controllers
[home release];
[menu release];
[so release];
[events release];
[info release];
[controllers release];

//add tab bar controller to view
[self.view addSubview:tabBarController.view];

[super viewDidLoad];
}

这是来自FirstViewController的一点,它模态地呈现了MainViewController ......

MainViewController *controller = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:controller animated:YES];
    [controller release];

我没有收到任何编译器错误或警告,并且应用程序运行膨胀......没有崩溃。它只是没有显示已经达到的TabBar,而且在我在AppDelegate上创建它时它已经习惯了。我检查了我的NIB中的所有内容,我的网点似乎已经连接好了。我不知道发生了什么。救命啊!

2 个答案:

答案 0 :(得分:0)

我不确定这是否是您问题的原因,但可能是:

您可以创建控制器数组,如下所示:

NSArray *controllers = [NSArray arrayWithObjects:home, menu, so, events, info, nil];

没关系。 controllers有+0(自动释放)保留计数。

然后将其分配给tabBar的viewControllers属性:

tabBarController.viewControllers = controllers;

那也没关系。 controllers现在有+1保留计数(自动释放+ tabBarController保留)

然后发布controllers

[controllers release];

controllers现在有+0保留计数,这意味着下次runloop旋转时,您的数组将被释放,后续视图将消失(因为它们已被释放),以及您的应用程序可能最终会崩溃。

简单修复:您没有allocretaincopy controllers数组,因此您不对release负责。删除release,您的内存管理将是正确的。它可能会解决您的问题,因为这是我唯一能够立即看到的问题。

答案 1 :(得分:0)

来自文档:

  

因为UITabBarController类   继承自UIViewController   类,标签栏控制器有它们的   自己可以访问的视图   视图属性。 部署时   标签栏界面,必须安装   此视图作为窗口的根。   与其他视图控制器不同,标签   吧界面永远不应该   安装为另一个视图的孩子   控制器。