2011-09-26 37 views
0

我正在开发一个应用程序,需要用户先登录才能使用服务的其余部分。我是否正确地呈现我的viewControllers?

这个应用程序是由标签栏控制器与4个标签栏项目。所有这4个标签栏项目都有导航控制器。

现在,我以模态方式呈现loginViewController。我在登录过程中实现了“记住我”功能,这将在用户下次重新启动应用程序时自动登录。我通过使用NSUserDefaults保存指标并在viewDidLoad期间执行此操作,检查用户是否选择了“记住我”,并在需要时以模态方式呈现loginViewController。

当用户注销时,我会再次以模态方式呈现loginViewController并删除NSUserDefaults。但是,这将使tabBarController的viewController的其余部分保持与用户注销之前相同的状态,这意味着当用户再次登录时它不会是全新的副本。如何在用户登录时确保它是全新的副本?意思是textFields和all,不应该显示在之前的登录过程中所做的修改。

所有的一切,我要加载的viewController tabBarController的全新副本,只要在

回答

0

有几种方法可以做到这一点。一种是在登出时发送NSNotification,并且具有需要重新加载其信息的所有视图,观察该通知并进行更新。

另一种方法是更新每个视图的数据viewDidAppear。这种方法的主要缺点是它会每次更新,无论它们是否注销。

通知的方式是这样的:

在注销视图控制器:

if (userDidLogout) 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName: USER_LOGOUT_NOTIFICATION]; 
} 

在需要了解视图控制器:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateMyData:) name: USER_LOGOUT_NOTIFICATION object: nil] 

//... 

- (void) updateMyData: (NSNotification*) note 
{ 
    // ... 
} 
+0

这很好,只是当用户登录时我正好看到事件。在用户注销时显示更改会很奇怪。 –

0

。在用户登录按下按钮logout,请确保你释放了所有的活动视图。重新登录时,请创建一个新的视图集。

您可以使用NSUserDefaults来检查loginlogout,整个过程必须在逻辑上同步。您需要担心的唯一事情就是正确释放所有视图,并在重新登录时正确删除它们。确保没有内存泄漏,并且您的视图控制器遵循Apple的 Memory Management指导原则。

0

这是我会怎么做:

viewWillAppear中被调用每次你打开的选项卡。您可以在viewWillAppear中重新加载视图内容。

此解决方案每次用户打开视图时都会重新载入视图。有更好的方法来保存最后的用户状态,所以每当用户进入视图时,检查UserState(即LoggedIn/LoggedOut)是否匹配,如果不重新加载视图,则不需要重新加载。

1

iPhone是一个 “个人”设备。这不是一个网络浏览器。浏览器是不同的。在iPhone上,如果可能的话避免显式注销,或者使找到注销按钮非常困难。 Facebook,Twitter,Foursquare都做到这一点。您的手机始终与您同在,并且注重隐私的用户将设置解锁密码。即使其他智能手机也可以远程擦除(不像浏览器)。

在为移动设备开发时,请考虑移动设备。并非您的网络应用中的所有功能都需要在移动设备上实施。

话虽如此,如果您仍然需要一个注销机制,nsnotifications是要走的路。

+0

感谢您的建议,但我不明白为什么要“隐藏”注销按钮。如果用户选择注销,让用户注销并没有什么坏处,不是吗? –

+0

没有伤害,但没有必要。除非您将手机借给某个可能会使用您的应用的人 – Mugunth

+0

虽然我同意iPhone应该是个人设备,但他们经常落入其他人的手中,有时甚至是恶作剧的手。当然,你已经看过明显不是由主人写的facebook帖子(即“我爱我的女朋友太多了!她是世界上最好的女人”等等,等等等等:)让用户注销是一个合理的选项,就像用户选择不注销一样,这是一个可供选择的选项。 – Olie