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

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

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

Ответ 1

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

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

SubscriptionsController *subscriptionsController = [[[SubscriptionsController alloc] init] autorelease];

Ответ 2

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

Удалите код в отдельном окне просмотра UIViewControllersDidLoad и сделайте это...

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;