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 Въпросът всъщност няма нищо общо с езика, който използвате. Трябва да се уверите, че присвоявате tabBarItems на вашите контролери за изглед преди да конфигурирате своя UITabBarController с тези контролери за изглед, тъй като за да покаже елементите на лентата с раздели, UITabBarController трябва да получи достъп до свойството tabBarItem на своите дъщерни контролери за изглед. Когато дъщерните контролери за преглед получат viewDidLoad, елементите на лентата с раздели вече трябва да са били показани, така че е твърде късно да се зададе tabBarItem в viewDidLoad. Надявам се това да изясни малко нещата. - person Costique; 14.12.2018

Правилно. Иконите не се показват, защото изгледът (освен първия, все още не е зареден). И не се зарежда, докато не докоснете изглед, защото 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;
person Jordan    schedule 11.12.2010