简单的方法来覆盖哪个屏幕显示第一个iOS
现在我试图故事板了,我有我的UITableViewController
作为我的rootViewController
。现在,在某些情况下,如果我的用户未登录,我想先看到另一个UIViewController
。我知道我可以执行一个segue它,但从我的理解TableView
仍然会尝试加载,这不是我想要的,除非他们提供有关此UIViewController
的信息,我试图首先出现(if说一个关键不存在于NSUserDefaults
)例如。简单的方法来覆盖哪个屏幕显示第一个iOS
所以我的问题是,有一个简单的解决方案,我也许可以添加到我的appDelegate为“覆盖”的rootViewController
从情节串连图板,或出现前,然后有一个按钮,只需在其辞退回到了那个rootViewController
在故事板?
谢谢!
,你可以:
使用不同的初始视图控制器(可以在故事板指定此)。在该视图控制器中,检查用户是否已登录。如果是,则通过手动触发的segue直接转换到表视图控制器。如果没有,则显示登录屏幕。
子类UITableViewController。检查viewDidLoad中的登录。如果不是,则提供一个模态登录视图控制器。
你可能不想做它在应用程序的委托,因为这将需要您手动加载故事板,这意味着不必要的代码。
例如,如果用户未登录,一个简单的方法是将表格部分设置为0;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSInteger numberOfSections = 0;
if (userLoggedIn)
{
numberOfSections = 1;
}
return numberOfSections;
}
真的类似于这样的问题: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;
}
而不是初始化故事板的新实例,如果只有一个故事板,则可以使用self.window.rootViewController.storyboard。 – ullstrm 2014-10-31 06:36:36
窃不以为然。这将导致“登录屏幕”始终被创建,即使它不是必需的。我会在应用程序委托中进行手动初始化。 – ullstrm 2014-10-31 06:38:12
这是一个不成熟的优化。 iOS始终加载和卸载视图控制器。我们为什么不相信它做正确的事情?实际上,应用程序委托中的初始化过度限制了操作系统 - 它被迫在特定的时间加载故事板。我们如何知道在didFinishLaunchingWithOptions被调用的时候它还没有加载故事板?在高级编程环境中 - 尤其是iOS - 最好不要与系统对抗。 – 2014-10-31 08:57:28
你也可以争辩说,登录屏幕不应该在viewDidLoad中处理这个逻辑。在我看来,它应该在它的“外面”处理。这不仅仅是过早优化的哲学问题。 – ullstrm 2014-10-31 09:14:31