Cra*_*tis 13 macos xcode cocoa storyboard osx-yosemite
我有一个Swift应用程序正在启动一个简单的NSWindow,如下所示:
func applicationDidFinishLaunching(notification: NSNotification!) {
let storyboard = NSStoryboard(name: "MainStoryboard", bundle: NSBundle.mainBundle())
windowController = storyboard.instantiateInitialController() as? NSWindowController
windowController?.showWindow(self)
}
Run Code Online (Sandbox Code Playgroud)
这很好用,我的应用程序启动并出现窗口.但是:大小始终相同.
在故事板中,我指定了一个Autosave名称:

另请注意,Restorable复选框已选中.
但无论如何,每次窗口看起来都是相同的.这在过去总是"刚刚起作用",所以我不知道这是一个错误,还是我错过的一个部分.在手动实例化和显示窗口时,自动保存是否自动与故事板一起使用?
Cra*_*tis 29
这似乎是一个Xcode错误.我能够通过手动设置NSWindowController windowFrameAutosaveName属性来解决它:
windowController?.windowFrameAutosaveName = "Main App Window"
但是......如果属性设置为与 Interface Builder中显示的值不同,这仅对我有用.如果它以编程方式设置为与IB中使用的值相同,则不起作用.
所以在IB中,自动保存名称被保留MainAppWindow,并以编程方式设置为Main App Window.
我不知道是否有更好的方法,但这里的问题是,当在 Interface Builder 中设置 AutosaveName并且Window 通过 Segue打开时,窗口在预定义的位置打开并保存框架,覆盖最后保存的帧...
如果你有一个预定义到屏幕中心的位置,每次打开窗口时,它都会出现在中心位置并保存该位置。
为了避免这种情况,在恢复保存的框架后,我在窗口控制器(不是在 IB 中)中设置了AutosaveName:
class MyWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
let thewindow = window as! NSWindow
/// restore position
thewindow.setFrameUsingName("MyWindow")
self.windowFrameAutosaveName = "MyWindow"
}
}
Run Code Online (Sandbox Code Playgroud)
为了满足接受的答案和评论中确定的两个条件,对窗口控制器进行子类化似乎是可行的。然后,您可以避免在代码中为每个窗口控制器唯一设置此属性,而只需指定故事板的窗口自动保存属性(并设置窗口控制器的子类)。
WindowControllerwindowFrameAutosaveName必须是
frameAutosaveNameclass AutoFrameSavingWindowController: NSWindowController
{
override func awakeFromNib() {
if let autosaveName = window?.frameAutosaveName {
windowFrameAutosaveName = autosaveName + " temp"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2574 次 |
| 最近记录: |