2013-12-02 6 views
9

У меня есть панель вкладок, созданная в раскадровке с 4 вкладками. Приложение имеет систему входа в систему, и когда я выхожу из системы, я хочу отключить вторую и третью вкладки. Содержимое второго и третьего вкладок зависит от того, какой пользователь зарегистрирован, поэтому мне не нужна старая информация, появляющаяся там.Переименованные вкладки в табеле

Как бы переигнорировать их?

ответ

2

С:

NSMutableArray *tabBarButtons = [tabBar.items mutableCopy]; 

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

И чтобы закончить, выполнить

[tabBar setItems:tabBarButtons animated:/*YES or NO*/]; 

, чтобы применить изменения к вашей панели вкладок

5

Это ситуация подходит для использования NSNotification. Когда статус «вошел в систему» ​​изменится, опубликуйте уведомление. Соблюдайте это уведомление в соответствующих контроллерах представления и затем реагируйте, включив/отключив/показывая/очистив элементы пользовательского интерфейса в их представлении.

2

Итак, в основном вы хотите отключить выступы буксировки. Вы можете использовать метод делегата от «UITabBarController»,

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 

И вернуть NO, для которого вкладку вы хотите, чтобы отключить.

+0

Я не хочу, чтобы отключить, я хочу, чтобы сбросить содержимое – cannyboy

3

Вы можете попробовать:

UITabBarController *tabBarController; 
NSMutableArray *tabBarButtons = [tabBarController.tabBar.items mutableCopy]; 
[tabBarButtons removeObjectAtIndex:1]; 
[tabBarButtons removeObjectAtIndex:2]; 
[tabBarController.tabBar setItems:tabBarButtons animated:NO]; 
+0

Я попробовал это в делегат приложения и в TabBarController subclasss .. Я получаю эту ошибку: «Непосредственно изменения панель вкладок, управляемая контроллером панели вкладок, не допускается ' – cannyboy

+0

@cannyboy вы пытались заменить viewController вместо удаления, как в моем решении? –

3

Один из способов, вы можете попробовать с помощью ключа наблюдения, как это: - Whenver вы нажимаете на выходе из системы магазина некоторого значения в строке, которая NSString *selectedValue сделать property и synthesize из одна и та же. Поэтому, когда значение строки изменится ниже, будет отправлено уведомление

// Также добавьте ниже в свой контроллер.

[yourBtn addObserver:self forKeyPath:@"contentViewController.selectedValue" options:NSKeyValueObservingOptionNew context:(__bridge void *)(self)]; 

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"contentViewController.selectedValue"]) 
//your Code stuff here 
} 
2

Вы можете унаследовать свой UITabViewController, чтобы он мог слушать NSNotification то в вашем UITabViewController, почему бы вам не создать две новые контроллеры для замены старых, как показано ниже

NSMutableArray *viewControllers = [[NSMutableArray alloc] initWithArray:_tabBarController.viewControllers]; 
SecondViewController * resetSecondViewController = [[SecondViewController alloc] init]; 
ThirdViewController * resetThirdViewController = [[ThirdViewController alloc] init]; 
[viewControllers replaceObjectAtIndex:2 withObject:resetSecondViewController]; 
[viewControllers replaceObjectAtIndex:3 withObject:resetThirdViewController]; 
[_tabBarController setViewControllers:viewControllers animated:NO]; 
+0

Кстати, другим решением является наличие UINavigationViewController в качестве элементов вашего UITabBarViewController и повторная инициализация rootViewController второго и третьего navigationController. –

1

Я не действительно используют раскадровки, но в прямом коде это кусок пирога.

В вашем AppDelegate.h создайте свойство для вкладки 2/tab 3 с соответствующими контроллерами представлений.

@property (nonatomic,strong) MyViewController *tab2 
@property (nonatomic,strong) MyOtherViewController *tab3 

и т.д., и использовать это для инициализации вкладки - это будет delegate.tab2 или self.tab2, если вы находитесь в AppDelegate.m, но доступны по всему миру.

Off верхней части моей головы, вы бы инициализируете это нравится:

[self.tabBarController setViewControllers:@[tab1,self.tab2,self.tab3,tab4]]; 
[self.window setRootViewController:self.tabBarController]; 

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

например. в AppDelegate.m

-(void)logout 
{ 
    [self clearView]; 
    // the rest of hte method 
} 

-(void)clearView 
{ 
    [self.tab2 resetData]; 
} 

в MyViewController.m

-(void)resetData 
{ 
    [textFieldOrWhateverTheUIElementIs setText:@""]; 
// and so on 
} 

Simple.

0

У меня есть 2 варианта

  1. Как вы сказали, вкладка 2 & 3 показывает основаны на входе пользователя в системе. Так что наверняка у вас будет userId этого пользователя, и вы сохраните его где-нибудь, например NSUserDefault. Когда вы выходите из системы, очистите userId и в 2 & 3 вкладки загружают информацию, если userId имеет некоторое значение.

  2. Clear UserId и сделать или заставить пользователя войти в мягкий способ использовать это

    [метод] [self.navigationController popToRootViewControllerAnimated: YES];

на кнопку выхода из системы действий

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