Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“我怎么能?”;重置";iPhone应用程序中的选项卡栏_Iphone_Tabbar - Fatal编程技术网

“我怎么能?”;重置";iPhone应用程序中的选项卡栏

“我怎么能?”;重置";iPhone应用程序中的选项卡栏,iphone,tabbar,Iphone,Tabbar,我有一个iPhone应用程序: 当你打开应用程序时,你会看到“LoginView”。若您登录到应用程序,您将看到一个TabBarController。在第三个也是最后一个选项卡中有“注销”按钮。如果单击,将再次看到“登录视图”。我的问题是,如果您再次登录,您会看到“旧”选项卡栏,所选选项卡是第三个,而不是第三个,并且有一个“注销”按钮。此外,如果用户使用其他用户登录,请查看前一个用户的旧数据(非常危险) 代码如下: -h代表: UITabBarController *tabBarControll

我有一个iPhone应用程序: 当你打开应用程序时,你会看到“LoginView”。若您登录到应用程序,您将看到一个TabBarController。在第三个也是最后一个选项卡中有“注销”按钮。如果单击,将再次看到“登录视图”。我的问题是,如果您再次登录,您会看到“旧”选项卡栏,所选选项卡是第三个,而不是第三个,并且有一个“注销”按钮。此外,如果用户使用其他用户登录,请查看前一个用户的旧数据(非常危险)

代码如下: -h代表:

UITabBarController *tabBarController;
LoginViewController *loginView;
-Delegate.m(使用选项完成启动):

Delegate.m(方法):

以下是两种不同ViewController中的两种方法:

- (IBAction)login:(id)sender {

     TabNavisAppDelegate *delegate =
      (TabNavisAppDelegate *) [[UIApplication sharedApplication] delegate];
  [delegate loginComplete];
  }
(注销方法相同)

伙计们,我怎么才能解决这个痛苦的问题? 所以,这里有一个实现我想要的功能的应用程序列表:“Foursquare”、“Brightkite”等。 每个都有一个登录屏幕、一个选项卡视图和一个注销按钮


谢谢大家。

tabBarController似乎没有发布。[释放前保留计数应为1]tabBarController可能被保留在某个位置。检查它的保留计数。

对于注销登录情况,在注销或下一次登录时,所有类型的东西都需要重置自己,我喜欢创建一个通知,比如“NewUserReset”所有需要将自身重置为原始状态的操作都会侦听通知并运行一个方法,该方法可以执行所需的任何重置操作。选项卡栏会将按钮标题更改为注销、临时数据结构nil/zero/release等

它很好地将注销与所有必须完成的事情解耦,这样您就不会试图操纵视图控制器和数据存储,以及从接收注销点击的控制器查看外观

发送通知很容易。当用户点击注销按钮时,您将发出如下通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"JMUserLogout" 
                                                object:nil];
- (void)resetForNewUser:(NSNotification *)notif {
    // DO SOMETHING HERE
}
你不必称它为JMUserLogout,你只需要一个你能识别的字符串和一些东西——我用了你的首字母——来帮助确保你不会意外地发送一个通知,该通知与你不知道正在监听的通知同名

当该通知发出时,任何已向defaultCenter注册以侦听@“JMUserLogout”的对象都将执行您选择的任何操作。以下是对象注册的方式(应该位于ViewWillLoad或对象的初始化方法等位置):

那里的选择器resetForNewUser:,只是通知发出时要运行的方法的名称。该方法如下所示:

[[NSNotificationCenter defaultCenter] postNotificationName:@"JMUserLogout" 
                                                object:nil];
- (void)resetForNewUser:(NSNotification *)notif {
    // DO SOMETHING HERE
}
在上面写着//DO SOMETHING的地方,您将添加特定于应用程序的代码。例如,您可以添加选项卡栏作为JMUserLogout通知的观察者。在resetForNewUser:method中,您将注销按钮的名称更改为Login

在保存前一个用户的旧数据的ViewController或View或data store中,resetForNewUser方法将删除所有这些数据,并将其设置回新用户应该使用的方式。例如,如果前一个用户在UITextField中输入数据,您将删除文本yourTextFieldName.text=@

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

[[NSNotificationCenter defaultCenter] removeObserver:self];

希望这是有道理的。它们提供了几个使用通知的示例应用程序。

tabBarController对象可能已保留在某个位置。试着把它去掉

并使用以下代码进行登录、注销方法

- (void)loginComplete {

    // initialize the tabBarController here. like the following
    if(tabBarController == nil){
    tabBarController = [[UITabBarController alloc] init];

    }
    [loginView dismissModalViewControllerAnimated:YES];
    [window addSubview:tabBarController.view];
}

- (void)logoutComplete {
    [[tabBarController view] removeFromSuperview];
    [tabBarController release];
    tabBarController = nil;
    [window addSubview:loginView.view];
}

这样您的问题就会得到解决。

如果您想在注销后重置前一个用户的旧数据。。您所要做的就是重置UITabBarController的viewControllers属性

因此,如果您正在子类化UITabBarController,下面的代码应该会将您的应用程序恢复到其原始状态

    self.viewControllers = @[self.viewControllerOne, self.viewControllerTwo, self.viewControllerThree];
从文件中:

如果在运行时更改此属性的值,则选项卡栏控制器将在安装新的视图控制器之前删除所有旧的视图控制器。新视图控制器的选项卡栏项目将立即显示,并且不会设置动画以固定到位


我应该把[tabbarController release]放在这里吗嘿,Joaquin,你能详细解释一下你的评论吗?对不起,我不明白你所说的“我应该把[tabbarController release]放在这里吗?”对不起,Sagar,没有点击。发布前的retain为2,发布后的retain为1,如果我再次登录并注销(retain为1),则应用程序崩溃。retain count 2确认它是retain。[tabBarController release]将retain count降低1,当retain count达到0时,它将获得释放,使用retain count 0,您将访问tabBarController,这就是应用程序崩溃的原因!!!!你能把与tabBarController相关的代码放在Delegate.h中定义为“@property(nonatomic,retain)IBOutlet UITabBarController*tabBarController;”我如何实现你的想法?你有没有举个例子?你认为上面提到的应用程序(如果你知道的话)是这样还是那样?(还有Skype没问题)我将通过编辑我的答案提供一些代码和更多详细信息。我花了很长时间来编写。:)感谢所有的Matthew,但是我错过了一个步骤:如何创建新的tabbar或将tabbar重置为第一个选项卡。你对此有什么想法吗?你真是太好了我不明白我应该删除什么。请解释,谢谢Satya我已经把它放在:UITabBarController*newTabBarController=[[UITabBarController alloc]initWithNibName:@“主窗口”包:nil];[loginView DismissModalViewController激活:是];self.tabBarController=newTabBarController;[窗口添加子视图:tabBarController.view];但它不起作用。当我点击“登录”按钮时,“选项卡栏”将显示空ap
    self.viewControllers = @[self.viewControllerOne, self.viewControllerTwo, self.viewControllerThree];