重新初始化标签栏中的标签

时间:2013-12-02 13:51:45

标签: ios objective-c uitabbarcontroller uitabbar

我在故事板中设置了一个带有4个标签的标签栏。该应用程序有一个登录系统,当我注销时,我想将第二个和第三个选项卡清零。第二个和第三个选项卡内容取决于登录的用户,因此我不希望旧信息出现在那里。

我如何重新初始化它们?

8 个答案:

答案 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的某些值会使propertysynthesize相同。因此,每当字符串值发生变化时,将通知观察者

//还在视图控制器中添加以下内容。

[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个选项

  1. 正如你所说的标签2&图3显示了基于用户登录。因此,您肯定会拥有该用户的userId,并且您将保存它,例如NSUserDefault。当您注销时清除userId并在2&如果userId具有某个值,则有3个选项卡加载信息。

  2. 清除UserId并使用此

    强制或强制用户以软方式登录

    [method] [self.navigationController popToRootViewControllerAnimated:YES];

  3. 登出按钮操作