在 appDelegate 中首次展示视图
Posted
技术标签:
【中文标题】在 appDelegate 中首次展示视图【英文标题】:Presenting a view for the first time in appDelegate 【发布时间】:2014-01-06 09:47:03 【问题描述】:目标:
当我的应用启动时 - 我需要它在它进入“主”屏幕之前显示一个视图。它是一个标签栏应用程序,此视图不是标签栏的一部分。
我正在使用 Storyboards 和 Xcode 5 - 仅限 ios7 的应用程序。
问题:
我有代码可以检查应用程序是否首次启动。在此基础上,我想向用户展示一个仅一次的视图。
我尝试过的:
以下代码位于应用程序的 appDelegate 中,因为这是一切开始的地方。我在那里调用以下代码:
-(void)showCountrySettings
if (self.termsHaveBeenAccepted)
BBCounterySettingsViewController *countrySettings = [[BBCounterySettingsViewController alloc]initWithNibName:@"View" bundle:nil];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER"];
[self.navigationController pushViewController:vc animated:YES];
我收到编译错误,因为[self.navigationController..]
不存在。 [self.tabbarcontroller...];
也没有
这很明显,因为我没有为这些设置属性 - 但我该如何解决这个问题并将标签栏连接到情节提要?
我错过了什么?
【问题讨论】:
你的 StoryBoard 中有 NavigationController 或 TabBarColler 作为起点吗? TabBarController - 设置为初始视图。 你只是想将一些视图显示为 pop 或者你需要显示一个 viewController。 它只是一个显示 T&C 的 viewController - 它只需要显示一次。模态视图可以在这里工作。 【参考方案1】:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
if(!isAgreementAccepted)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"IDD"];
self.window.rootViewController=vc;
return YES;
如果不接受协议,则在用户单击接受按钮时将 T&C viewController
设置为 rootViewController
,然后将 TabBarviewController
设置为 root。
你可以在任何地方通过应用程序委托访问寡妇对象
[[[UIApplication sharedApplication]delegate] window].rootViewController=tabViewController.
【讨论】:
这似乎是最简单的方法。我已经测试过了,它完全按照我的需要做。谢谢!【参考方案2】:以编程方式更改窗口的rootviewcontroller
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
UIStoryboard *aStoryBoard=[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
UITabBarController *aTabCtrl=[aStoryBoard instantiateViewControllerWithIdentifier:@"Tab"];
FirstVC *aFirstCtrl=[aStoryBoard instantiateViewControllerWithIdentifier:@"First"];
if(self.termsHaveBeenAccepted)
self.window.rootViewController=aFirstCtrl;
else
self.window.rootViewController=aTabCtrl;
return YES;
我已经测试过,这肯定会起作用。
【讨论】:
谢谢 - 是的,它确实有效 - 我会记住这段代码。我需要展示另一个屏幕,这段代码将在那里提供帮助。 是的,您可以更改任何屏幕。【参考方案3】:如果 Tabbarcontroller 是您的根视图控制器,则使用以下代码将解决您的 appdelegate 中的问题。
-(void)showCountrySettings
if (self.termsHaveBeenAccepted)
BBCounterySettingsViewController *countrySettings = [[BBCounterySettingsViewController alloc]initWithNibName:@"View" bundle:nil];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER"];
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
[tabBarController presentModalviewcontroller:vc animated:YES completionblock:nil];
【讨论】:
谢谢 - 但是 [self.tabbarcontroller...];给出错误:“在 BBAppDelegate 类型的对象上找不到属性 tabbarcontroller” UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;顺便说一句,为什么投反对票?给出适当的反对理由,以便每个人都可以学习。 谢谢 - 但是我收到以下消息:2014-01-06 12:12:45.327 BidOrBuy[1168:70b] 警告:尝试在添加您的 tabbarcontroller 的 viewcontroller 超级视图作为第一次单独调用 tabbarcontroller
【讨论】:
以上是关于在 appDelegate 中首次展示视图的主要内容,如果未能解决你的问题,请参考以下文章
PF QueryCollection ViewController 中首次加载时未出现图像
SwipeActions 按钮和 ToolBar 按钮触发的多个工作表(项目:)在 SwiftUI 中首次获取 nil 对象