如何"重置"iPhone应用程序中的标签栏

Joa*_*Coy 8 iphone tabbar

我有一个iPhone应用程序:当你打开应用程序时,你会看到"LoginView".如果您登录到应用程序,您会看到一个TabBarController.在第三个和最后一个选项卡中有"注销"按钮.如果单击,则会再次看到"LoginView".我的问题是,如果你再次登录,你会看到"旧"标签栏,所选标签是第三个,而不是一个标签,并且有一个"退出"按钮.此外,如果用户使用其他用户登录,请查看上一个用户的旧数据(非常危险).

这是代码: - Delegate.h:

UITabBarController *tabBarController;
LoginViewController *loginView;
Run Code Online (Sandbox Code Playgroud)

- Delegate.m(didFinishLaunchingWithOptions):

[self.window makeKeyAndVisible];

loginView = [[LoginViewController alloc] init];

if (YES) { /* if the user is not already logged */
    [self.window addSubview:loginView.view];
}
Run Code Online (Sandbox Code Playgroud)

Delegate.m(方法):

- (void)loginComplete {
    [loginView dismissModalViewControllerAnimated:YES];
    [window addSubview:tabBarController.view];
}

- (void)logoutComplete {
    [[tabBarController view] removeFromSuperview];
    [tabBarController release];
    [window addSubview:loginView.view];
}
Run Code Online (Sandbox Code Playgroud)

这是两个不同viewcontrollers中的两种方法:

- (IBAction)login:(id)sender {

     TabNavisAppDelegate *delegate =
      (TabNavisAppDelegate *) [[UIApplication sharedApplication] delegate];
  [delegate loginComplete];
  }
Run Code Online (Sandbox Code Playgroud)

(注销方法是一样的)

伙计们,我该如何解决这个痛苦的问题呢?所以,这里有一个我想要的应用程序列表:"Foursquare","Brightkite"等.每个人都有一个登录屏幕,一个标签栏视图和一个注销按钮.

感谢大家.

Mat*_*ick 10

对于login-logout-login情况,其中各种事情需要在注销或下次登录时自行重置,我喜欢创建通知,例如"NewUserReset".需要将自身重置为原始状态的所有内容都会侦听通知,并运行一种方法来执行所需的任何重置.标签栏会将按钮标题更改为注销,临时数据结构为零/零/自行释放等.

它很好地将注销与所有必须完成的操作分离,因此您不会尝试操作视图控制器和数据存储,也不会从接收注销点击的控制器中查看外观.

发送通知很简单.当用户点击"注销"按钮时,您将发出如下通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"JMUserLogout" 
                                                object:nil];
Run Code Online (Sandbox Code Playgroud)

您不必将其称为JMUserLogout,您只需要一个您能识别的字符串和一些东西 - 我使用您的姓名缩写 - 以帮助确保您不会意外地发送与通知同名的通知你不知道是在听.

当该通知发出时,任何已注册到defaultCenter以侦听@"JMUserLogout"的对象将执行您选择的任何操作.以下是您的对象注册的方式(这应该位于某些地方,如ViewWillLoad或对象的初始化方法):

[[NSNotificationCenter defaultCenter] addObserver:self 
                                     selector:@selector(resetForNewUser:)
                                         name:@"JMUserLogout"
                                       object:nil];
Run Code Online (Sandbox Code Playgroud)

那里的选择器resetForNewUser:只是通知结束时要运行的方法的名称.该方法如下所示:

- (void)resetForNewUser:(NSNotification *)notif {
    // DO SOMETHING HERE
}
Run Code Online (Sandbox Code Playgroud)

它在哪里说//在这里做,你将添加特定于你的应用程序的代码.例如,您可以添加选项卡栏作为JMUserLogout通知的观察者.在resetForNewUser:方法中,您可以将注销按钮的名称更改为Login.

在包含来自前一个用户的旧数据的ViewController或View或数据存储中,resetForNewUser方法将删除所有这些数据,并将其设置回新用户之前的方式.例如,如果先前的用户在UITextField中输入数据,则会删除文本yourTextFieldName.text = @"";

最后,在取消分配之前,还要将对象作为观察者移除,这一点很重要.在注册接收通知的每个对象的Dealloc方法中,您添加以下内容:

[[NSNotificationCenter defaultCenter] removeObserver:self];
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的.NSNotificationCenterApple文档解释了更多内容,它们提供了几个使用通知的示例应用程序.