UITabBarItems в UITabBar отображаются после того, как я щелкаю элемент, а не при запуске приложения - PullRequest
11 голосов
/ 11 декабря 2010

Это приложение, которое я пишу, имеет проблему.

Я устанавливаю UITabBar в окне своего приложения и устанавливаю значки в файлах просмотра.Но когда я запускаю приложение, появляются первые значки (я думаю, что представление загружено), а другие значки не отображаются, пока я не щелкаю по ним.

Нужно ли вводить self.tabBarItem в некоторыхдругой метод не viewDidLoad?

Спасибо всем заранее!

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

    SubscriptionsController *subscriptionsController = [[SubscriptionsController alloc] init];
    FavoritesController  *favoritesController  = [[FavoritesController  alloc] init];
    CategoriesController *categoriesController  = [[CategoriesController alloc] init];
    TagsController   *tagsController    = [[TagsController   alloc] init];
    HelpScreenController *helpScreenController  = [[HelpScreenController alloc] init];

    tabBar.viewControllers = [NSArray arrayWithObjects:
        subscriptionsController, 
        favoritesController, 
        categoriesController, 
        tagsController, 
        helpScreenController, 
        nil
        ];

    [window addSubview:tabBar.view];

    // Override point for customization after application launch.
    [window makeKeyAndVisible];
    return YES;
}

//The View

- (void)viewDidLoad {
    [super viewDidLoad];
    tabIcon = [[UITabBarItem alloc] initWithTitle:@"Abonime" image:[UIImage imageNamed:@"subscr.png"] tag:0];
    self.tabBarItem = tabIcon;
    [tabIcon release];
}

Ответы [ 2 ]

13 голосов
/ 11 декабря 2010

Я думаю, вы должны установить свойство tabBarItem в назначенном инициализаторе контроллера представления (исходя из вашего кода, оно должно быть -init для каждого из контроллеров).Фактически, контроллер панели вкладок достаточно умен, чтобы загружать представления по требованию, то есть свойство tabBarItem должно быть установлено до того, как viewDidLoad будет отправлено.

Кроме того, вы, похоже, пропускаете все контроллеры представления,Чтобы это исправить, сделайте следующее:

SubscriptionsController *subscriptionsController = [[[SubscriptionsController alloc] init] autorelease];
4 голосов
/ 11 декабря 2010

Правильно. Значки не отображаются, потому что вид (кроме первого, еще не загружен). И не загружается, пока вы не коснетесь представления, потому что viewDidLoad до этого не вызывался.

Удалить код в отдельных UIViewControllers viewDidLoad и сделать это ...

NSArray *controllers = [NSArray arrayWithObjects:
                                                [NSDictionary dictionaryWithObjectsAndKeys:@"SubscriptionsController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil],
                                                [NSDictionary dictionaryWithObjectsAndKeys:@"FavoritesController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil],
                                                [NSDictionary dictionaryWithObjectsAndKeys:@"CategoriesController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil],
                                                [NSDictionary dictionaryWithObjectsAndKeys:@"TagsController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil],
                                                [NSDictionary dictionaryWithObjectsAndKeys:@"HelpScreenController", @"class", [UIImage imageNamed:@"btn_tax.png"], @"icon", @"Abonime", @"title", nil],
                                                nil];

NSMutableArray *controllerArray = [NSMutableArray array] ;

 for (NSUInteger i = 0; i < [controllers count]; i++)
 {
    id newClass = [[NSClassFromString([[controllers objectAtIndex:i] objectForKey:@"class"]) alloc] init];
    UITabBarItem *tabItem = [[UITabBarItem alloc] init];
    tabItem.image = [[controllers objectAtIndex:i] objectForKey:@"icon"];
    tabItem.title = [[controllers objectAtIndex:i] objectForKey:@"title"];
    tabItem.tag = i;
    [(UIViewController*)newClass setTabBarItem:tabItem];
    [tabItem release];
    [controllerArray addObject:newClass];
    [newClass release];
 }

 tabBar.viewControllers = controllerArray;
...