iOS First Launch视图

时间:2014-05-20 17:50:11

标签: ios objective-c uiviewcontroller start-page

我正在尝试放置第一个启动视图。我已经尝试了一些东西,但那不起作用。

这就是我所拥有的:

- (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的对象类型。任何想法?

3 个答案:

答案 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 视图控制器之间设置入口点。

确保在界面构建器中从情节提要中删除所有入口点,为此,您需要选择ViewControllerEntry Point并取消选中Is Initial View Controller选项。 View Controller部分:

enter image description here

然后,您需要确保为所有潜在的入口点都分配了Storyboard Id,因为您将在AppDelegate.swift文件中的代码中使用此入口点。本示例使用bluered

enter image description here

接下来,您必须编辑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,然后重新运行!