我正在尝试放置第一个启动视图。我已经尝试了一些东西,但那不起作用。
这就是我所拥有的:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor whiteColor];
return YES;
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"yourCondition"])
{
//launch your first time view
self.viewController = [[viewController alloc] initWithNibName:@"viewController" bundle:nil];
}
else
{
//launch your default view
self.viewController = [[viewController alloc] initWithNibName:@"defaultViewController" bundle:nil];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"yourCondition"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
不知何故,它没有工作,它说找不到viewController作为AppDelegate的对象类型。任何想法?
答案 0 :(得分:3)
如果您什么都不做,则会出现故事板的初始视图控制器。如果您想要其他事情发生,您想要设置的是self.window.rootViewController
。在这种情况下,您还需要手动创建和显示窗口。
答案 1 :(得分:0)
application:didFinishLaunchingWithOptions:
的实施存在一些问题,这绝对是造成问题的原因。
我建议您阅读一些关于iOS开发入门的教程,因为如果您打算在未来进行任何认真的开发,这些是您需要掌握的基本概念。
话虽如此,以下代码应该看对你:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self setWindow:[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]];
UIViewController *viewController = nil;
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"yourCondition"])
{
//launch your first time view
viewController = [[viewController alloc] initWithNibName:@"viewController" bundle:nil];
}
else
{
//launch your default view
viewController = [[viewController alloc] initWithNibName:@"defaultViewController" bundle:nil];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"yourCondition"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
[[self window] setRootViewController:viewController];
[[self window] makeKeyAndVisible];
return YES;
}
application:didFinishLaunchingWithOptions:
的默认实现期望返回一个布尔值,由方法签名指示。
您还错过了方法开头的重要调用,该调用会为您的应用程序设置主NSWindow
。
正如@matt所指出的,您的代码期望您在AppDelegate上拥有一个属性,该属性将保留对viewController
的引用。根据您提到的有关编译错误的内容,您似乎没有设置此关系。碰巧的是,您可能不需要这样,因为您可以通过设置rootViewController
的{{1}}属性来实现相同的目标。
同样,我建议你阅读一些关于iOS开发的初学者教程或者购买一本像样的书,因为这样的问题是非常基础的。如果你单独遇到麻烦,你只会发现自己更加困惑,并且在开始钻研更复杂的代码时可能需要帮助。
答案 2 :(得分:0)
我在Swift中有解决方案,并在GitHub上发布了一个示例以供共享:
https://github.com/AppLogics/DynamicEntryPointExample-iOS
在这里,我将用它的简化版本进行说明,以动态/编程方式在 blue 和 red 视图控制器之间设置入口点。
确保在界面构建器中从情节提要中删除所有入口点,为此,您需要选择ViewController
和Entry Point
并取消选中Is Initial View Controller
选项。 View Controller
部分:
然后,您需要确保为所有潜在的入口点都分配了Storyboard Id
,因为您将在AppDelegate.swift
文件中的代码中使用此入口点。本示例使用blue
和red
接下来,您必须编辑AppDelegate.swift
文件。首先声明要测试的常量,并决定最初显示哪个View Controller,在这种情况下:
let blueEntryPoint = true
接下来,在注释didFinishLaunchingWithOptions
和语句// Override point for customization after application launch.
之间的默认return true
函数中插入一些代码,如下所示:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
//checking to see if the blue is true or false
if blueEntryPoint {
//Showing blue View Controller
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let mainViewController = storyboard.instantiateViewController(withIdentifier: "blue")
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = mainViewController
self.window?.makeKeyAndVisible()
} else {
//Not showing blue, i.e. will show red View Controller
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let surveyViewController = storyboard.instantiateViewController(withIdentifier: "red")
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = surveyViewController
self.window?.makeKeyAndVisible()
}
return true
}
运行此命令,然后将blueEntryPoint
更改为false
,然后重新运行!