我在故事板中设置了一个带有4个标签的标签栏。该应用程序有一个登录系统,当我注销时,我想将第二个和第三个选项卡清零。第二个和第三个选项卡内容取决于登录的用户,因此我不希望旧信息出现在那里。
我如何重新初始化它们?
答案 0 :(得分:5)
这种情况适合NSNotification
使用。当“登录”状态发生变化时,发布通知。在相应的视图控制器中观察此通知,然后通过在其视图中启用/禁用/显示/清除UI元素来做出反应。
答案 1 :(得分:3)
您可以尝试:
UITabBarController *tabBarController;
NSMutableArray *tabBarButtons = [tabBarController.tabBar.items mutableCopy];
[tabBarButtons removeObjectAtIndex:1];
[tabBarButtons removeObjectAtIndex:2];
[tabBarController.tabBar setItems:tabBarButtons animated:NO];
答案 2 :(得分:3)
您可以尝试使用这样的键值观察的一种方法: -
当您单击注销商店时,字符串中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
}
答案 3 :(得分:2)
使用:
NSMutableArray *tabBarButtons = [tabBar.items mutableCopy];
您将拥有代表您的标签的数组的可变副本。因此,使用此副本,您可以更改选项卡属性,根据需要删除选项卡,添加其他选项,...
要完成,请执行
[tabBar setItems:tabBarButtons animated:/*YES or NO*/];
将更改应用于标签栏
答案 4 :(得分:2)
所以基本上你想要禁用两个标签。 您可以使用“UITabbarController”的委托方法,
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
并返回NO,您要禁用哪个选项卡。
答案 5 :(得分: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];
答案 6 :(得分:1)
我没有真正使用故事板,但在直接代码中,这是小菜一碟。
在AppDelegate.h中为选项卡2 /选项卡3创建一个属性,其中包含相关的视图控制器。
@property (nonatomic,strong) MyViewController *tab2
@property (nonatomic,strong) MyOtherViewController *tab3
等并使用它来初始化选项卡 - 如果您在AppDelegate.m中,它将是delegate.tab2或self.tab2,但可以全局访问。
在我的脑海中,您可以将其初始化为:
[self.tabBarController setViewControllers:@[tab1,self.tab2,self.tab3,tab4]];
[self.window setRootViewController:self.tabBarController];
现在,当用户注销时,运行一个app delegate方法,该方法可以重置视图控制器,也可以放置一些东西。
e.g。在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
}
简单。
答案 7 :(得分:0)
我有2个选项
正如你所说的标签2&图3显示了基于用户登录。因此,您肯定会拥有该用户的userId,并且您将保存它,例如NSUserDefault。当您注销时清除userId并在2&如果userId具有某个值,则有3个选项卡加载信息。
清除UserId并使用此
强制或强制用户以软方式登录[method] [self.navigationController popToRootViewControllerAnimated:YES];
登出按钮操作