【问题标题】:How to pop up a view controller on top? [closed]如何在顶部弹出视图控制器? [关闭]
【发布时间】:2012-10-10 19:58:00
【问题描述】:

情况: 在我的应用程序中有很多视图控制器,它们以导航或模式视图控制器的形式呈现。该应用程序几乎通过所有屏幕与服务器通信。我想在他/她的凭据过期时向用户显示登录屏幕。我想将登录屏幕作为模式显示在屏幕上当前视图的顶部,并在登录成功后立即将其关闭。 我真的不知道我怎么能做到这一点。如果某些视图控制器在屏幕上显示了模态视图,并且登录屏幕也需要以模态形式呈现,我应该从哪里执行此操作。我尝试在 appDelegate 中切换窗口的 rootViewController ,但效果不佳,而且还搞砸了很多事情。请给我建议。

【问题讨论】:

    标签: iphone ios model-view-controller modalviewcontroller


    【解决方案1】:

    查看 UIViewControllerpresentViewController:animated:completion: 方法来呈现模态视图(只要您不是为 iOS

    【讨论】:

      【解决方案2】:

      我看到了你的问题。在我看来,最好的方法是创建一个简单的类,例如 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 来说,这将是一个很好的教科书示例。

      【讨论】:

      • 谢谢蒙迪。它奏效了。
      • 那么请检查复选标记;-)。
      • 出于好奇并且与手头的问题没有任何关系,这是拥有某个类的共享对象的标准方式吗?
      • @esqew 它确实工作得很好。也就是所谓的singleton设计。它对于应用内购买监控、网络状态、后台导入等非常有用
      【解决方案3】:

      仅在应用启动时检查它是一件好事。这样,建议在您的 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。

      【讨论】:

        猜你喜欢
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多