-1

Я создал пользовательский UITabBar, который работает очень хорошо, но я ввел изменение в навигацию, и теперь у меня возникают серьезные проблемы. Вот что у меня есть:пользовательский TabBar теряет изображения TabBarItem

Общие настройки

TabBarController 
    NavbarController1 - TabBarItem1 
     Links to: PeopleView 
    NavbarController2 - TabBarItem2 
     Links to: ContentView 
    NavbarController3 - TabBarItem3 
     Links to: ContentView //Same VC as TabBaritem 2. 

App Делегат - В моем методе didFinishLaunchingWithOptions я называю метод customizeTabBar следующим

-(void) customizeTabBar 
{ 

UITabBarController *tabVC = (UITabBarController *) self.window.rootViewController; 
//Load Navigation Bar images 
NSArray *unSelectedImages = [[NSArray alloc] initWithObjects:@"image1.jpg", @"image2.jpg", @"image3.jpg", @"image4.jpg", @"image5.jpg", nil]; 
NSArray *selectedImages = [[NSArray alloc] initWithObjects:@"image1_on.jpg", @"image2_on.jpg", @"image3_on.jpg", @"image4_on.jpg", @"image5_on.jpg", nil]; 

NSArray *items = tabVC.tabBar.items; 

for (int idx = 0; idx < items.count; idx++) 
{ 

    UITabBarItem *barItem = [items objectAtIndex:idx]; 
    barItem.tag = idx; 
    UIImage *selectedImage = [UIImage imageNamed:[selectedImages objectAtIndex:idx]]; 
    UIImage *unSelectedImage = [UIImage imageNamed:[unSelectedImages objectAtIndex:idx]]; 


    UIEdgeInsets inset = { 
     .top = 10, 
     .left = 0, 
     .bottom = -10, 
     .right = 0 
    }; 

    barItem.imageInsets = inset; 

    [barItem setFinishedSelectedImage:selectedImage withFinishedUnselectedImage:unSelectedImage]; 
} 

До сих пор это работает прекрасно , .

Вот где возникает проблема того, чтобы получить мой TabBarItem3 связать с ContentView, я осуществил следующий код в моем TabBarClass:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { 

if (viewController.tabBarItem.tag == 1 || viewController.tabBarItem.tag == 2) 
{ 
    // Validating if is necesarry to replace the TabBarController.ViewControllers 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 

    MediaList *mediaView = [storyboard instantiateViewControllerWithIdentifier:@"SB_MediaList"]; 
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mediaView]; 
    NSMutableArray *viewsArray = [NSMutableArray arrayWithArray:self.viewControllers]; 


    if (viewController.tabBarItem.tag == 1) 
    { 
     //Setting the specfic data for my instance for tabBarItem 1 
     NSLog(@"Here we are in 1"); 
     [mediaView setContent:@"Personalized content/data for TabBarItem 1"]; 
    } 
    else if (viewController.tabBarItem.tag == 2) 
    { 
     //Setting the specfic data for my instance for tabBarItem 2 
     NSLog(@"Here we are in 2"); 
     [mediaView setContent:@"Personalized content/data for TabBarItem 2"]; 
    } 
    [viewsArray replaceObjectAtIndex:viewController.tabBarItem.tag withObject:navigationController]; 
    self.viewControllers = viewsArray; 

} 
} 

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

UPDATE

Итак, я переместил вкладку метод бар настройки из моего делегата и в класс maintabbar и я называю его viewdidload а я Мех спрятанный didselectviewcontroller. Это, похоже, решает проблему с отсутствующими изображениями, но создало плохой побочный эффект мерцания на экране, когда я нажимаю любой из элементов шланга. Я пробовал различные комбинации удаления его из метода viewdidload, как мы это сделаем, но все равно не повезло.

ответ

0

Как я понимаю, цель всего этого состоит в том, чтобы не создавать разные классы для двух элементов панели табуляции, которые будет выполнять почти то же самое, но с разными данными.

Итак, кулак, вы должны определить класс, способный делать такую ​​вещь, назовем его CommonClass. Этот класс должен будет иметь необходимые методы для правильной инициализации. [Я уверен, что вы это сделали].

Затем на вашем раскадровке вам понадобятся два элемента: ViewController, каждый из которых является rootViewController соответствующего NavigationController.

enter image description here

Я настоятельно рекомендую делать так, вместо того, чтобы пытаться назначить новый экземпляр с помощью кода, как мы пытались на: Linking to a view multiple times from tabar. Эти два диспетчера представлений, очевидно, принадлежат к одному классу CommonClass, поэтому вы все равно будете повторно использовать этот класс. Таким образом, нам не придется изменять NavigationBar во время выполнения, которое может быть запутанным.

Затем, вы можете отправить необходимую информацию инициализации для вашего CommonClass имея метод на вашем CommonClass, который будет загружать необходимые Вам информацию/данные в соответствии с выбранным tabBarItem, вы можете сделать это на методе viewDidLoad.

как:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    if (self.tabBarController.selectedIndex == 1) { 
     [self customizeWithData:@"Specific data for my first instance"]; 
    } else if (self.tabBarController.selectedIndex == 2) { 
     [self customizeWithData:@"Specific data for my second instance"];   
    } 
} 

Таким образом, вы будете делать настройки вашей панели вкладок в только одна часть вашего кода, и как вы не будете изменять его во время выполнения вы выиграли» t нужно настроить в других частях, вызывающих мерцание.

+0

Я принял ваше руководство и переместил все. Мне нравится дизайн лучше, но, к сожалению, проблема мерцания все еще существует. См. Http://stackoverflow.com/q/19123984/2804909 – mday

Смежные вопросы