【问题标题】:iOS First Launch viewiOS 首次启动视图
【发布时间】:2014-07-09 02:51:32
【问题描述】:

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

这是我所拥有的:

- (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 的对象类型。有什么想法吗?

【问题讨论】:

  • 一个问题是return YES之后的代码不会执行——你已经返回了!
  • @matt 好的,我已经把return YES 放到了最后。谢谢!
  • 您是否在考虑启动图像,而不是应用的第一个视图?
  • @aaron 我正在考虑一个现有的视图控制器,它应该让用户稍微了解一下应用程序。我已经完成了 Tour,但我需要知道如何仅在 App 首次启动时显示视图控制器。

标签: ios objective-c uiviewcontroller start-page


【解决方案1】:

如果你什么都不做,故事板的初始视图控制器就会出现。如果你想让其他事情发生,你想设置的是self.window.rootViewController。在这种情况下,您还需要手动创建和显示窗口。

【讨论】:

【解决方案2】:

您对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 的引用。从您提到的编译错误来看,您似乎没有这种关系设置。碰巧的是,您可能根本不需要这个,因为您可以通过设置 NSWindowrootViewController 属性来实现相同的目标。

再次,我建议您阅读一些 iOS 开发初学者教程或购买一本像样的书,因为此类问题相当基础。如果您独自在这方面遇到麻烦,您只会发现自己更加困惑,并且可能需要您开始研究更复杂的代码的帮助。

【讨论】:

    【解决方案3】:

    我有 Swift 的解决方案,并在 GitHub 上发布了一个示例以分享:

    https://github.com/AppLogics/DynamicEntryPointExample-iOS

    我将在这里解释它的简化版本,以动态/以编程方式在 bluered 视图控制器之间设置入口点。

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

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

    接下来您必须编辑AppDelegate.swift 文件。首先声明要测试的常量并决定最初显示哪个 View Controller,在这种情况下:

    let blueEntryPoint = true

    接下来在注释:// Override point for customization after application launch. 和语句:return true 之间的默认 didFinishLaunchingWithOptions 函数中插入一些代码,如下所示:

    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 并重新运行它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多