我正在使用Xcode 8和故事板进行mac开发。
我有两个storyboard
个NSWindowController
。
1)。如何在启动应用时显示两个窗口?
2)。如何在其他窗口上按下按钮显示窗口?
修改
代码:
func applicationDidFinishLaunching(_ aNotification: Notification)
{
let st = NSStoryboard(name: "Logs", bundle: nil) // Logs is my storyboard name
var logWindow: NSWindowController? = nil
logWindow = st.instantiateInitialController() as! NSWindowController?
if logWindow?.window?.isVisible == false
{
logWindow?.window?.setIsVisible(true)
}
}
答案 0 :(得分:1)
这两个问题归结为几乎相同:如何从故事板中显示窗口?无论您是想在启动应用程序时执行此操作还是在用户单击按钮时都应该这样做“这真的会影响您显示窗口所需的操作。”
查看NSStoryboard
class,您将找到从故事板中实例化窗口控制器的方法。因此,如果您还没有NSStoryboard
,请创建一个let storyboard = NSStoryboard(name: "Main", bundle: nil)
let windowController = storyboard.instantiateController(withIdentifier: "My Window Controller") as! NSWindowController
实例,然后使用该实例来实例化相关的窗口控制器。例如,如果您的窗口控制器被调用"我的窗口控制器"并位于主要故事板......
windowController
然后用applicationDidFinishLaunching(notification:)
做任何你喜欢的事。如果要在启动应用程序时显示两个窗口,那么可能您的应用程序委托有两个属性用于跟踪相应的窗口控制器。在您的app delegate d = {'中国':18950, '我们':16734, '我国':15400, ...}
q = 0
for i in d:
if '国' in i:
a = (d[i])
q += a
print(q)
方法中,您可以使用我显示的代码创建两个窗口,并将窗口控制器分配给这些窗口。如果要在用户单击按钮时打开一个窗口,请将上面代码中的代码放在按钮的操作中,并将结果窗口控制器的引用存储在某个适当的对象中,可能是窗口控制器所在的位置出现。
答案 1 :(得分:1)
一切都是正确的,但问题出在logWindow
。
我假设你知道在执行方法后局部变量已经死了。
如您所见logWindow
是一个局部变量。当applicationDidFinishLaunching(_ aNotification: Notification)
正在执行时,变量处于活动状态,将创建一个新窗口并显示。
applicationDidFinishLaunching(_ aNotification: Notification)
执行完毕后,您的变量logWindow
不存在。因此,分配的内存将自动解除分配(通过ARC),窗口将被销毁/取消分配。
所有这一切发生得如此之快,这是因为isVisible()
返回true
而没有看到窗口的原因(它返回true
因为该方法仍在执行中logWindow
{1}}还活着。
所以只需要让logWindow
成为一个类的变量(在你试图显示窗口的类中),你就可以了。