2010-03-11 98 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類 繼承,標籤欄控制器有各自 自己的觀點,即通過 視圖屬性進行訪問。當部署 標籤欄界面時,您必須將此視圖安裝爲您的窗口的根。 不像其他視圖控制器,一個標籤 欄界面絕不應 安裝爲另一個視圖 控制器的孩子。

相關問題