【发布时间】:2014-10-01 22:53:43
【问题描述】:
我在使用 addSubview() 加载视图控制器视图时遇到了一个奇怪的行为:
硬件和软件: OSX 10.9.5 Mavericks、XCode 6 Beta 6 上的 Cocoa Swift 应用程序
目标: 应用程序,以编程方式从其自己的 xib 加载 ViewController 并将 VCs 视图映射到主窗口
MainMenu.xib: 只有一个视图(NSView)作为控制器视图锚点的窗口
SpecialsVC.xib 视图(NSView)只有一个标签“特殊视图”,视图链接到文件所有者
AppDelegate 和视图控制器 SpecialsVC 的 Swift 代码:
class SpecialsVC : NSViewController {
required init(coder aDecoder: NSCoder!) { super.init(coder: aDecoder); }
override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
@IBOutlet weak var anchorView: NSView!
var specialsVC = SpecialsVC(nibName: "SpecialsVC", bundle: nil );
func applicationDidFinishLaunching(aNotification: NSNotification?) {
anchorView.addSubview( specialsVC.view ); // <— 2nd window opens here
specialsVC.view.frame = anchorView.bounds;
}
func applicationWillTerminate(aNotification: NSNotification?) { }
}
运行应用: 1 ) 主窗口按预期打开,视图控制器从 nib 加载,其视图放置在主窗口的锚视图上。 —> 好的 2 ) 标题为“Window”的第二个空窗口打开。可以关闭,对主窗口没有影响。 —> ?????????
调试: 跨过anchorView.addSubview(specialsVC.view)时出现意外窗口
也试过1: 不是以编程方式加载视图控制器,而是通过 MainMenu.xib 中 View-Controller-Object 的插座 -> 相同的效果
也试过2: 在主窗口上放置一个按钮,并将视图控制器加载到按钮操作中的局部变量中。 --> 没有第二个窗口出现,但是离开动作时控制器丢失了。将本地变量复制到实例变量 —> 出现第二个窗口
提示: 更改视图控制器视图的大小时,第二个窗口的大小不会更改。
我做错了什么?第二个窗口来自哪里?
向乌尔里希致敬
【问题讨论】:
-
specialsVC.xib 可能包含一个窗口,该窗口在 specialsVC.view 调用期间被实例化。再次检查您的 xib。
-
将本地变量复制到实例变量 —> 出现第二个窗口 即即使没有 -[view] 调用,窗口也会显示?那么我在 xib 的想法上一定是错的。