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

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

Я настраиваю 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];
}

person Olsi    schedule 11.12.2010    source источник


Ответы (2)


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

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

SubscriptionsController *subscriptionsController = [[[SubscriptionsController alloc] init] autorelease];
person Costique    schedule 11.12.2010
comment
Как мне это сделать в Swift 2? - person deepakssn; 27.10.2015
comment
Я смотрел на этот ответ, но мне все еще нужны некоторые подробности. Не могли бы вы дать полный ответ в Swift 4? Спасибо :) - person Andy Lebowitz; 12.12.2018
comment
@AndyLebowitz Проблема на самом деле не имеет ничего общего с языком, который вы используете. Вы должны убедиться, что вы назначили tabBarItem своим контроллерам представлений до настройки UITabBarController с этими контроллерами представлений, потому что для отображения элементов панели вкладок UITabBarController необходимо получить доступ к свойству tabBarItem своих дочерних контроллеров представлений. Когда дочерние контроллеры представления получают viewDidLoad, элементы панели вкладок уже должны были отображаться, поэтому слишком поздно устанавливать tabBarItem в viewDidLoad. Надеюсь, это немного прояснит ситуацию. - person Costique; 14.12.2018

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

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

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;
person Jordan    schedule 11.12.2010