简介:
我想创建一个在首次启动时显示一些“用户指南”的应用程序,我已经完成了检测该应用程序是否首次启动的部分,但是当涉及到设置 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/