情况:我的应用中有很多视图控制器,它们以导航或模式视图控制器的形式呈现。该应用程序几乎从所有屏幕与服务器进行通信。我想在他/她的凭据过期时向用户显示登录屏幕。我想将登录屏幕作为模式显示在屏幕上当前视图的顶部,并在登录成功后立即将其关闭。我真的不知道我怎么能做到这一点。如果某些视图控制器在屏幕上显示了模态视图,并且登录屏幕也需要以模态形式呈现,我应该从哪里执行此操作。我尝试在 appDelegate 中切换窗口的 rootViewController ,但效果不佳并且还搞砸了很多事情。请给我建议。
问问题
747 次
3 回答
2
查看的呈现模态视图UIViewController
的presentViewController:animated:completion:
方法(只要您不是为 iOS <5.0 构建的)。
于 2012-10-10T20:05:20.783 回答
1
我看到了你的问题。在我看来,最好的方法是创建一个简单的类,LoginHandler.h
并在应用程序的生命周期内保持它。
您不必在应用程序启动时对其进行初始化。您可以实现一个方便的技巧,以便在需要时始终获取此类的相同实例:
// @interface
+(id)sharedHandler;
//@implementation
+(id)sharedHandler {
static id sharedHandler = nil;
if (sharedHandler == nil) {
[sharedHandler = [[LoginHandler alloc] init];
}
return sharedHandler;
}
现在您只需使用 获取共享实例[LoginHandler sharedHandler]
,类似于用户NSUserDefaults
或UIApplication
。
你可以有一个像
-(BOOL)renewLoginFromViewController:(UIViewController*)controller`;
它提供了一个模型视图控制器,如下所示:
[controller presentModalViewController:loginScreen];
如果登录成功则返回YES
(或者在登录成功之前它不会消失。)
您可以处理此类中的所有登录逻辑。这将是一个很好的封装教科书示例。
于 2012-10-10T20:30:01.470 回答
0
仅在应用程序启动时检查它是一件好事。这样,建议在您的 AppDelegate.m 上的 didFinishLaunchWithOptions 上执行此操作。
你可以这样做:
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
if (USER_HAS_VALID_CREDENTIALS) {
self.viewController = [[[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil] autorelease];
} else {
self.viewController = [[[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil] autorelease]; // need to get credentials
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
请记住在成功登录后从 LoginViewController 启动 RootViewController。
于 2012-10-10T20:16:55.853 回答