проблема с пользовательской панелью вкладок и контроллером навигации - PullRequest
0 голосов
/ 16 сентября 2011

Хорошо, у меня есть следующее:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    MainViewController * tabBarController = [[MainViewController alloc] init];
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];
    [tabBarController release];

    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|
     UIRemoteNotificationTypeAlert|
     UIRemoteNotificationTypeSound];

    return YES;

}

Здесь MainViewController является просто подклассом UITabBarController, и внутри viewDidLoad у MainViewController у меня есть:

- (void)viewDidLoad
{
    [super viewDidLoad];

 NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:3];

MapViewController * map = [[MapViewController alloc] init];
    [localControllersArray addObject:map];

    //[localNavigationController release];
    [map release];


    ListViewController * voteSpot = [[ListViewController alloc] initWithTabBar];
    [localControllersArray addObject:voteSpot];

    //[localNavigationController release];
    [voteSpot release];


    ProfileViewController * profile = [[ProfileViewController alloc] initWithTabBar];
    [localControllersArray addObject:profile];

    //[localNavigationController release];
    [profile release];


    self.viewControllers = localControllersArray;
    [localControllersArray release];
}

и теперь я вижу только:

enter image description here

Есть идеи, почему это белый экран?

Вот пример моего initWithTabBar:

-(id) initWithTabBar {
    if ([self init]) {
        self.navigationItem.title=@"Map";
    }
    return self;
}

На мгновение игнорируем нижнюю панель вкладок (отсутствует средняя), которая делает именно то, что я хочу. Меня смущает то, что viewController связан с каждой вкладкой, на нем ничего нет, хотя на самом деле MapViewController имеет MapView в Это. Когда я нажимаю на любую вкладку, она падает (программа получила сигнал: EXC_BAD_ACCESS) в int retVal = UIApplicationMain(...)

UPDATE:

Если вы хотите отладить его, я загрузил пример кода на git hub , где вы можете скачать весь проект (это простой тестовый проект, обещаю)

1 Ответ

0 голосов
/ 16 сентября 2011

Вы должны добавить свои контроллеры в свойство TabBarControllers viewControllers. Вот так:

self.viewControllers = [NSArray arrayWithObjects:map, voteSpot, profile, nil];

Редактировать: Извините, я не видел, что у вас уже было это. Однако, в зависимости от конкретной проблемы, приведенный выше фрагмент может решить вашу проблему.

Несколько вещей:

  1. Я не вижу создания вашего локального контроллера ControlArray. Это авто-релиз или нет?
  2. Ошибка, которую вы получаете, указывает на проблему с памятью (то есть доступ к переменной, которая была освобождена). Вы можете установить NSZombieEnabled = YES в схеме сборки, чтобы точно определить, какая переменная вызывает проблему.
  3. Мне лично нравится создавать контроллеры представления в делегате приложения и назначать их там. Нет никакой причины (о которой я знаю), что она не должна работать в viewDidLoad.

Редактировать 2: Посмотрев на ваш проект, я смог запустить его и показать ваши вкладки, изменив метод applicationDidFinishLaunchingWithOptions, чтобы он выглядел так:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    BaseViewController * tabBarController = [[BaseViewController alloc] init];

    NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:3];   

    //MapViewController * map = [[MapViewController alloc] init];
    //UINavigationController* mapNavController = [[[UINavigationController alloc]
    //                                              initWithRootViewController:map] autorelease];
    //[map release];
    //[localControllersArray addObject:mapNavController];


    ProfileViewController * profile = [[ProfileViewController alloc] init];
    [localControllersArray addObject:profile];
    [profile release];

    tabBarController.viewControllers = localControllersArray;
    [localControllersArray release];

    self.window.rootViewController = tabBarController;
    [self.window makeKeyAndVisible];
    [tabBarController release];
    return YES;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...