简单的方法来覆盖哪个屏幕显示第一个iOS

简单的方法来覆盖哪个屏幕显示第一个iOS

问题描述:

现在我试图故事板了,我有我的UITableViewController作为我的rootViewController。现在,在某些情况下,如果我的用户未登录,我想先看到另一个UIViewController。我知道我可以执行一个segue它,但从我的理解TableView仍然会尝试加载,这不是我想要的,除非他们提供有关此UIViewController的信息,我试图首先出现(if说一个关键不存在于NSUserDefaults)例如。简单的方法来覆盖哪个屏幕显示第一个iOS

所以我的问题是,有一个简单的解决方案,我也许可以添加到我的appDelegate为“覆盖”的rootViewController从情节串连图板,或出现前,然后有一个按钮,只需在其辞退回到了那个rootViewController在故事板?

谢谢!

,你可以:

  • 使用不同的初始视图控制器(可以在故事板指定此)。在该视图控制器中,检查用户是否已登录。如果是,则通过手动触发的segue直接转换到表视图控制器。如果没有,则显示登录屏幕。

  • 子类UITableViewController。检查viewDidLoad中的登录。如果不是,则提供一个模态登录视图控制器。

你可能不想做它在应用程序的委托,因为这将需要您手动加载故事板,这意味着不必要的代码。

+0

窃不以为然。这将导致“登录屏幕”始终被创建,即使它不是必需的。我会在应用程序委托中进行手动初始化。 – ullstrm 2014-10-31 06:38:12

+0

这是一个不成熟的优化。 iOS始终加载和卸载视图控制器。我们为什么不相信它做正确的事情?实际上,应用程序委托中的初始化过度限制了操作系统 - 它被迫在特定的时间加载故事板。我们如何知道在didFinishLaunchingWithOptions被调用的时候它还没有加载故事板?在高级编程环境中 - 尤其是iOS - 最好不要与系统对抗。 – 2014-10-31 08:57:28

+1

你也可以争辩说,登录屏幕不应该在viewDidLoad中处理这个逻辑。在我看来,它应该在它的“外面”处理。这不仅仅是过早优化的哲学问题。 – ullstrm 2014-10-31 09:14:31

例如,如果用户未登录,一个简单的方法是将表格部分设置为0;

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
NSInteger numberOfSections = 0; 
if (userLoggedIn) 
{ 
    numberOfSections = 1; 
} 

return numberOfSections; 
} 
+0

如果我走了这条路线,你会碰巧知道在UITableView中间显示文字的最佳路线,例如“未登录”吗?在这种情况下简单地隐藏一个按钮然后不隐藏是最佳实践,反之亦然? – Joey 2014-10-30 16:40:18

+0

当我完成它时,我刚刚在视图中间添加了一个UILabel。但是,由于您要立即继续使用其他UIViewController,因此这可能不是必需的,特别是如果这是一个模态视图。 – Gismay 2014-10-30 16:48:18

真的类似于这样的问题:UIStoryboard load from app delegate

你应该在视图控制器在Interface Builder的标识部分设置故事板ID。然后,你可以通过

UIViewController *viewControllerToShow = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 

获取屏幕上,你最终会像这样的东西:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]]; 

     UIViewController *vc = nil; 
     if (someKindOfCheck) { 
      vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 
     } 
     else { 
      vc =[storyboard instantiateInitialViewController]; 
     } 

     // Set root view controller and make windows visible 
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
     self.window.rootViewController = vc; 
     [self.window makeKeyAndVisible]; 

    return YES; 
} 
+0

而不是初始化故事板的新实例,如果只有一个故事板,则可以使用self.window.rootViewController.storyboard。 – ullstrm 2014-10-31 06:36:36