Мой UITabBarController не отображается, но его первое представление?

Недавно я провел некоторую реорганизацию своего проекта, и теперь я не вижу свой контроллер панели вкладок, но появляется его первое представление контроллера представления. Вот разбивка всего, что происходит до возникновения проблемы.

App Delegate загружает FirstViewController пером. FirstViewController загружает данные приложения с моего сервера, а затем представляет MainViewController модальным переходом. MainViewController - это место, где должен появиться UITabBarController. Это очень простой класс.

.H

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

@property (nonatomic, retain) UITabBarController *tabBarController;

@end

Их

@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, и мои розетки, кажется, подключены нормально. Понятия не имею, что случилось. Помощь!


person E-Madd    schedule 11.03.2010    source источник


Ответы (2)


Я не уверен, что это причина вашей проблемы, но это может быть:

Вы создаете свой массив контроллеров, например:

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

Это нормально. controllers имеет +0 (автоматически выпущенный) счетчик удержания.

Затем вы назначаете его свойству viewControllers tabBar:

tabBarController.viewControllers = controllers;

Это тоже нормально. controllers теперь имеет счетчик удержания +1 (автосвобождение + удержание tabBarController)

Затем вы отпускаете controllers:

[controllers release];

controllers теперь имеет +0 счетчик сохранения, что означает, что при следующем вращении цикла выполнения ваш массив будет освобожден, последующие представления исчезнут (потому что они были освобождены), и ваше приложение, вероятно, выйдет из строя.

Простое исправление: вы не использовали alloc, retain или copy массив controllers, поэтому вы не несете ответственности за release это. Удалите release, и ваше управление памятью будет правильным. Это может решить вашу проблему, потому что это единственное, что я сразу вижу, что может быть проблемой.

person Dave DeLong    schedule 11.03.2010
comment
Хорошая мысль, но это не помогло. Что на самом деле действительно работало, так это добавление этого непосредственно перед тем, как я установил представление контроллера в представление tabBarController. CGRect frame = CGRectMake (self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); tabBarController.view.frame = frame; Я взял его в Google. Кажется неправильным, что я должен это делать, но это работает. - person E-Madd; 12.03.2010
comment
на самом деле [NSArray arrayWithObjects] генерирует объект с сохраненным счетчиком 1, и он будет выпущен один раз где-то в будущем. Он не может вернуть объект с сохраненным счетчиком = 0, так как это будет означать, что он освобожден. - person Andrei Stanescu; 19.02.2011
comment
@ Андрей, верно. +0 - это соглашение об обозначении автоматически выпущенного объекта. (+0! = 0) - person Dave DeLong; 19.02.2011

Из документации:

Поскольку класс UITabBarController наследуется от класса UIViewController, контроллеры панели вкладок имеют собственное представление, доступное через свойство представления. При развертывании интерфейса панели вкладок вы должны установить это представление в качестве корня вашего окна. В отличие от других контроллеров представления, интерфейс панели вкладок никогда не следует устанавливать как дочерний элемент другого контроллера представления.

person Mark Adams    schedule 18.02.2011