2010-03-11 65 views
0

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

应用程序委托使用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中的所有内容,并且我的网点似乎已经连接好了。我不知道发生了什么事。帮帮我!

回答

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旋转,你数组将被释放,随后的视图将消失(因为它们已被释放),并且您的应用程序可能最终崩溃。

简单的解决方法:你没有allocretain,或copycontrollers阵列,所以你是不负责release它。删除release,你的内存管理将是正确的。它可能会解决您的问题,因为这是我立即发现可能是问题的唯一一件事。

+0

好一点,但是这并没有解决它。实际上最终做的工作是在我将控制器的视图设置为tabBarController的视图之前添加这个。 的CGRect帧= CGRectMake(self.view.frame.origin.x, \t \t \t \t \t \t \t self.view.frame.origin.y, \t \t \t \t \t \t \t self.view.frame.size .width, \t \t \t \t \t \t \t self.view.frame.size.height); tabBarController.view.frame = frame; 我从谷歌搜索捡起来。我不应该这样做,但它是有效的。 – 2010-03-12 03:02:30

+0

实际上,[NSArray arrayWithObjects]生成一个保留计数为1的对象,它将在未来的某个地方发布。它不能返回保留计数= 0的对象,因为这意味着它将被释放。 – 2011-02-18 21:21:21

+0

@Andrei的权利。 '+ 0'是一个表示自动释放对象的惯例。 ('+ 0'!='0') – 2011-02-18 21:33:16

0

从文档:

因为从UIViewController中 类的UITabBarController类 继承,标签栏控制器有各自 自己的观点,即通过 视图属性进行访问。当部署 标签栏界面时,您必须将此视图安装为您的窗口的根。 不像其他视图控制器,一个标签 栏界面绝不应 安装为另一个视图 控制器的孩子。

相关问题