简介:

我想创建一个在首次启动时显示一些“用户指南”的应用程序,我已经完成了检测该应用程序是否首次启动的部分,但是当涉及到设置 View Controller 部分时,我无法确定知道怎么做。

现状:

我已经进行了很多研究,并且看到了很多有关“如何以编程方式快速设置初始 View Controller ”这样的主题的Q/A文章,但是基本上所有这些文章都是以ios开发为例的,它们的UIWindow都没有或UINavigationController(rootViewController:)在OSX开发中匹配。然后我发现didFinishLaunchingWithOptions文件中似乎没有AppDelegate.swift这样的东西,相反,只有applicationDidFinishLaunching(_ aNotification: Notification)

问题:

我已经取消了两个View Controller的Is Initial Controller选项的检查,并且它们都具有Storyboard ID(标识符?)和它们自己的指定类。

MainPageController

UserGuidePageController

还是我也应该指定并标识我的窗口 Controller ?因为我不知道该如何使用窗口 Controller 。

为了在AppDelegate中为我的应用程序设置初始 View Controller ,我需要做什么?

P.S.这是我的界面 View 的图片:

Storyboard界面

AppDelegate.swift

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

  let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: Bundle.main)
  var window = MainWindow().window

  func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) - > Bool {
    return true
  }

  func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Insert code here to initialize your application
    let firstLaunch = UserDefaults.isFirstLaunch()
    let mainPageController = storyboard.instantiateController(withIdentifier: NSStoryboard.Name("MainPageController")) as? MainPageController
    let userGuidePageController = storyboard.instantiateController(withIdentifier: NSStoryboard.Name("MainPageController")) as? UserGuidePageController
    if !firstLaunch {
      print("first run")
      window?.contentViewController = userGuidePageController
    } else {
      print("not first run")
      window?.contentViewController = mainPageController
    }
  }

  func applicationWillTerminate(_ aNotification: Notification) {
    // Insert code here to tear down your application
  }
}


我尝试过这种方法,但是效果不佳,我的代码有什么问题吗?

最佳答案

在开始时,您需要从应用程序委托(delegate)类处理此类情况
适用于iOS APP

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {


let shouldShowUserGuide = // your cached key from user defaults for example

let mainController = //MainPageController Instance
let userGuide = //UserGuidePageController Instance


if shouldShowUserGuide {
window.rootViewController = userGuide
}else{
window.rootViewController = mainController
}
window.makeKeyAndVisisble()
  return true
}

//这段代码我只是用sublime而不是xcode编写的,因此可能需要格式化它并解决任何语法问题

对于OSX
MainWindow:NSWindowController
func applicationDidFinishLaunching(_ aNotification: Notification) {
        let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: Bundle.main)
        var window = storyboard.instantiateController(withIdentifier: "MainWindow") as! NSWindowController
        let firstLaunch = true//UserDefaults.isFirstLaunch()
        let mainPageController = storyboard.instantiateController(withIdentifier: "MainController") as! NSViewController
        let userGuidePageController = storyboard.instantiateController(withIdentifier: "UserGuideController") as! NSViewController
        if firstLaunch {
            print("first run")
            window.contentViewController = userGuidePageController
        } else {
            print("not first run")
            window.contentViewController = mainPageController
        }
        window.showWindow(self) // needed as long as your window controller has no static window content (No Content View Controller)
    }

关于macos - 如何使用Swift 4 Xcode 10在Cocoa中的 Storyboard 中以编程方式设置初始 Controller ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52626056/

10-11 07:57
查看更多