tim*_*imv 4 macos xcode storyboard swift osx-elcapitan
我是Mac OSX的新手,并且Apple宣传代码正在变得相似的事实决定告诉民众我正在编写代码,因为我们应该能够制作Mac OSX版本.iPhone和iPad版本都很好,即将发布第二版,所以没有问题.
所以我将NSWindowController子类化以获取对工具栏的访问权,并研究如何在工具栏上删除和添加项目,但对于我的生活,我无法获得一个NSViewController(firstViewController)来解雇并调出第二个NSViewController(secondViewController)在同一NSWindowController中.
所以2个问题是1.我希望能够在代码中从第一个NSViewController执行SegueWithIdentifier,并且2.通过替换同一个NSWindowController中的第一个NSViewController来调出第二个NSViewController.
如果我向firstViewController添加一个按钮并将segue放到secondViewController然后当我选择按钮时,secondViewController就好了,但是在一个单独的窗口中,我想要它不同的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()
}
Run Code Online (Sandbox Code Playgroud)
这是我的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)
}
}
Run Code Online (Sandbox Code Playgroud)
您需要使用自定义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
}
}
}
Run Code Online (Sandbox Code Playgroud)
就我而言,我正在使用一张纸,想要转换到另一张不同尺寸的纸张,所以我需要做更多:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)