Мой UITabBarController не появляется, но его первое представление? - PullRequest
0 голосов
/ 12 марта 2010

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

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

@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 голосов
/ 19 февраля 2011

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

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

0 голосов
/ 12 марта 2010

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

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

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, что означает, что в следующий раз при вращении runloop ваш массив будет освобожден, последующие представления исчезнут (потому что они были освобождены), и ваше приложение, вероятно, будет в конечном итоге сбой.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...