如何在顶部弹出一个视图控制器?

时间:2012-10-10 19:58:01

标签: iphone ios model-view-controller modalviewcontroller

情况: 在我的应用程序中有很多视图控制器,它们被呈现为导航或模态视图控制器。该应用程序几乎从所有屏幕与服务器通信。我想在他/她的凭据过期时向用户显示登录屏幕。我想将登录屏幕作为模式显示在屏幕上当前视图的顶部,并在登录成功后立即将其关闭。 我真的不知道如何实现这一目标。如果某个视图控制器在屏幕上显示模态视图,并且还需要将登录屏幕显示为模态,我应该从哪里开始。我尝试在appDelegate中切换窗口的rootViewController,但是它运行不正常并且搞砸了很多东西。请给我一些建议。

3 个答案:

答案 0 :(得分:2)

查看UIViewController的{​​{3}}方法以显示模态视图(只要您不是为iOS< 5.0构建)。

答案 1 :(得分:1)

我看到了你的问题。在我看来,最好的方法是设一个简单的课程,比如LoginHandler.h并在应用程序的生命周期内保留它。

您不必在应用启动时初始化它。您可以实现一个方便的技巧,以便在需要时始终获得此类的相同实例:

// @interface
+(id)sharedHandler;

//@implementation
+(id)sharedHandler {
   static id sharedHandler = nil;
   if (sharedHandler == nil) {
      [sharedHandler = [[LoginHandler alloc] init];
   }
   return sharedHandler;
}

现在您只需使用[LoginHandler sharedHandler]获取共享实例,类似于用户NSUserDefaultsUIApplication

您可以使用

之类的方法
-(BOOL)renewLoginFromViewController:(UIViewController*)controller`; 

它提供了一个模型视图控制器,如下所示:

[controller presentModalViewController:loginScreen]; 

如果登录成功则返回YES(或者在登录失败之前它不会消失。)

您可以从此课程处理所有登录逻辑。对于 encapsulation 来说,这将是一个很好的教科书示例。

答案 2 :(得分:0)

仅在应用启动时检查它是一件好事。这样建议在didFinishLaunchWithOptions上的AppDelegate.m上执行此操作。

你可以这样做:

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。