我是Mac OSX的新手,并且Apple宣传代码正在变得相似的事实决定告诉民众我正在编写代码,因为我们应该能够执行Mac OSX版本。 iPhone和iPad版本都很好,即将发布第二版,所以没有问题。
所以我将NSWindowController子类化以获取对工具栏的访问权,并研究如何删除和添加工具栏上的项目,但是对于我的生活,我无法获得一个NSViewController(firstViewController)来解雇并调出第二个NSViewController (secondViewController)在同一个NSWindowController中。
所以有两个问题 1.我希望能够在代码和第一个NSViewController中执行SegueWithIdentifier 2.通过替换同一NSWindowController中的第一个NSViewController来调出第二个NSViewController。
如果我向firstViewController添加一个按钮并将一个segue放到secondViewController然后当我选择按钮时,secondViewController出现就好了,但是在一个单独的窗口中,我想要它不同的NSWindowController并且firstViewController没有得到替换但留在NSWindowController。
所以我知道segue的想法会起作用,但它不能在代码中工作,当我从一个按钮插入segue时它可以工作但是进入一个不属于NSWindowController的单独的NSViewController。
我正试图在这个问题上找到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。它的选择很好但是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)
}
}
答案 0 :(得分:6)
您需要使用自定义segue类(如果它足以满足您的需要,可能需要NSTabViewController
)。将segue的类型设置为Custom,并指定您的类名:
......并实施它。没有动画,很简单:
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
}
}
}
在我的情况下,我使用了一张纸,想要转换到另一张不同尺寸的纸张,所以我需要做更多的事情:
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
}
}
}