替换 Swift2 Storyboard 下的 NSViewController MAC OSX
Replace NSViewController under Swift2 Storyboard MAC OSX
我是 Mac OSX 的新手,随着 Apple 宣传代码主体变得相似这一事实,我决定告诉人们我正在编写代码,因为我们应该能够做一个Mac OSX 版本。 iPhone 和 iPad 版本都很好,即将发布第二个版本,所以没有问题。
所以我将 NSWindowController 子类化以访问工具栏并研究如何在工具栏上删除和添加项目,但是对于我的生活我无法让一个 NSViewController (firstViewController) 关闭和调出第二个 NSViewController (secondViewController) 在同一个 NSWindowController 中。
所以这两个问题是
1. 我希望能够从代码中的第一个 NSViewController 执行 SegueWithIdentifier 并且
2. 通过替换同一个 NSWindowController 中的第一个 NSViewController 来调出第二个 NSViewController。
如果我向 firstViewController 添加一个按钮并向 secondViewController 添加一个 segue,那么当我 select 按钮时,secondViewController 出现就好了,但在单独的 window 中与 NSWindowController 不同我想要它并且 firstViewController 没有被替换而是留在 NSWindowController 中。
所以我知道 segue 的想法会起作用,但它在代码中不起作用,当我从一个按钮插入 segue 时它会起作用,但会插入到一个单独的 NSViewController 中,它不是 NSWindowController 的一部分。
我正试图从 Apple 那里找到一些关于这个问题的编程指南,但到目前为止还没有成功。
这是我的故事板的概述:
这是我的 NSWindowController 子类,func loginToMe2Team 是从 NSToolBar 触发的,它的工作只是在控制台上显示打印语句时找到。
import Cocoa
class me2teamWindowsController: NSWindowController {
@IBOutlet var mySignUp : NSToolbarItem!
@IBOutlet var myToolbar : NSToolbar!
let controller = ViewController()
override func windowDidLoad() {
super.windowDidLoad()
print("window loaded")
}
override func windowWillLoad() {
print("window will load")
}
@IBAction func logInToMe2Team(sender: AnyObject){
controller.LogIn() //THIS IS THE FUNC I AM TESTING WITH
}
@IBAction func signUpToMe2Team(sender: AnyObject){
controller.signUp()
}
这是我的 NSViewController 的子类,带有 func LogIn。它得到 selected 就好了,但 performSegueWithIdentifier 不是。我确实删除并通过了标识符以确保它是相同的。
import Cocoa
import WebKit
class ViewController: NSViewController {
@IBOutlet weak var theWebPage: WebView!
@IBOutlet weak var progressIndicator: NSProgressIndicator!
override func viewDidLoad() {
super.viewDidLoad()
let urlString = "https://thewebpage.com.au"
self.theWebPage.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: urlString)!))
}
override func viewDidAppear() {
}
func LogIn() {
print("I logged in")
self.performSegueWithIdentifier("goToTeamPage", sender: self)
//THIS IS THE BIT THATS NOT WORKING
}
func signUp() {
print("I have to sign up now")
}
override var representedObject: AnyObject? {
didSet {
}
}
func webView(sender: WebView!, didStartProvisionalLoadForFrame frame: WebFrame!)
{
self.progressIndicator.startAnimation(self)
}
func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!)
{
self.progressIndicator.stopAnimation(self)
}
}
您需要使用自定义 segue class(或者可能 NSTabViewController
,如果它足以满足您的需要)。将 segue 的类型设置为 Custom,并指定您的 class 名称:
…并实施。没有动画,很简单:
class ReplaceSegue: NSStoryboardSegue {
override func perform() {
if let src = self.sourceController as? NSViewController,
let dest = self.destinationController as? NSViewController,
let window = src.view.window {
// this updates the content and adjusts window size
window.contentViewController = dest
}
}
}
在我的例子中,我使用的是 sheet 并想转换到具有不同尺寸的不同 sheet,所以我需要做更多的事情:
class ReplaceSheetSegue: NSStoryboardSegue {
override func perform() {
if let src = self.sourceController as? NSViewController,
let dest = self.destinationController as? NSViewController,
let window = src.view.window {
// calculate new frame:
var rect = window.frameRectForContentRect(dest.view.frame)
rect.origin.x += (src.view.frame.width - dest.view.frame.width) / 2
rect.origin.y += src.view.frame.height - dest.view.frame.height
// don’t shrink visible content, prevent minsize from intervening:
window.contentViewController = nil
// animate resizing (TODO: crossover blending):
window.setFrame(window.convertRectToScreen(rect), display: true, animate: true)
// set new controller
window.contentViewController = dest
}
}
}
我是 Mac OSX 的新手,随着 Apple 宣传代码主体变得相似这一事实,我决定告诉人们我正在编写代码,因为我们应该能够做一个Mac OSX 版本。 iPhone 和 iPad 版本都很好,即将发布第二个版本,所以没有问题。
所以我将 NSWindowController 子类化以访问工具栏并研究如何在工具栏上删除和添加项目,但是对于我的生活我无法让一个 NSViewController (firstViewController) 关闭和调出第二个 NSViewController (secondViewController) 在同一个 NSWindowController 中。
所以这两个问题是 1. 我希望能够从代码中的第一个 NSViewController 执行 SegueWithIdentifier 并且 2. 通过替换同一个 NSWindowController 中的第一个 NSViewController 来调出第二个 NSViewController。
如果我向 firstViewController 添加一个按钮并向 secondViewController 添加一个 segue,那么当我 select 按钮时,secondViewController 出现就好了,但在单独的 window 中与 NSWindowController 不同我想要它并且 firstViewController 没有被替换而是留在 NSWindowController 中。
所以我知道 segue 的想法会起作用,但它在代码中不起作用,当我从一个按钮插入 segue 时它会起作用,但会插入到一个单独的 NSViewController 中,它不是 NSWindowController 的一部分。
我正试图从 Apple 那里找到一些关于这个问题的编程指南,但到目前为止还没有成功。
这是我的故事板的概述:
这是我的 NSWindowController 子类,func loginToMe2Team 是从 NSToolBar 触发的,它的工作只是在控制台上显示打印语句时找到。
import Cocoa
class me2teamWindowsController: NSWindowController {
@IBOutlet var mySignUp : NSToolbarItem!
@IBOutlet var myToolbar : NSToolbar!
let controller = ViewController()
override func windowDidLoad() {
super.windowDidLoad()
print("window loaded")
}
override func windowWillLoad() {
print("window will load")
}
@IBAction func logInToMe2Team(sender: AnyObject){
controller.LogIn() //THIS IS THE FUNC I AM TESTING WITH
}
@IBAction func signUpToMe2Team(sender: AnyObject){
controller.signUp()
}
这是我的 NSViewController 的子类,带有 func LogIn。它得到 selected 就好了,但 performSegueWithIdentifier 不是。我确实删除并通过了标识符以确保它是相同的。
import Cocoa
import WebKit
class ViewController: NSViewController {
@IBOutlet weak var theWebPage: WebView!
@IBOutlet weak var progressIndicator: NSProgressIndicator!
override func viewDidLoad() {
super.viewDidLoad()
let urlString = "https://thewebpage.com.au"
self.theWebPage.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: urlString)!))
}
override func viewDidAppear() {
}
func LogIn() {
print("I logged in")
self.performSegueWithIdentifier("goToTeamPage", sender: self)
//THIS IS THE BIT THATS NOT WORKING
}
func signUp() {
print("I have to sign up now")
}
override var representedObject: AnyObject? {
didSet {
}
}
func webView(sender: WebView!, didStartProvisionalLoadForFrame frame: WebFrame!)
{
self.progressIndicator.startAnimation(self)
}
func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!)
{
self.progressIndicator.stopAnimation(self)
}
}
您需要使用自定义 segue class(或者可能 NSTabViewController
,如果它足以满足您的需要)。将 segue 的类型设置为 Custom,并指定您的 class 名称:
…并实施。没有动画,很简单:
class ReplaceSegue: NSStoryboardSegue {
override func perform() {
if let src = self.sourceController as? NSViewController,
let dest = self.destinationController as? NSViewController,
let window = src.view.window {
// this updates the content and adjusts window size
window.contentViewController = dest
}
}
}
在我的例子中,我使用的是 sheet 并想转换到具有不同尺寸的不同 sheet,所以我需要做更多的事情:
class ReplaceSheetSegue: NSStoryboardSegue {
override func perform() {
if let src = self.sourceController as? NSViewController,
let dest = self.destinationController as? NSViewController,
let window = src.view.window {
// calculate new frame:
var rect = window.frameRectForContentRect(dest.view.frame)
rect.origin.x += (src.view.frame.width - dest.view.frame.width) / 2
rect.origin.y += src.view.frame.height - dest.view.frame.height
// don’t shrink visible content, prevent minsize from intervening:
window.contentViewController = nil
// animate resizing (TODO: crossover blending):
window.setFrame(window.convertRectToScreen(rect), display: true, animate: true)
// set new controller
window.contentViewController = dest
}
}
}