gpt4 book ai didi

xcode - IBAction使窗口在OS X的 cocoa 中可见

转载 作者:行者123 更新时间:2023-12-03 17:49:02 25 4
gpt4 key购买 nike

我有一个带有按钮的窗口。当我单击按钮时,它将打开另一个窗口(两个窗口都在同一个xib文件中)。我通过将第一个窗口中的按钮绑定到第二个窗口的orderFront来完成此操作。这按预期工作。
现在,我需要一个回调函数(IBAction)在第二个窗口可见时被触发(以根据第一个窗口中的设置对第二个窗口进行一些更改)。我在第二个窗口的控制器类中有占位符IBAction,但是我似乎找不到与“绑定”窗口绑定的触发器。
奇怪的是,在NSWindow的任何地方都可以看到(回调)回调函数。只需在.NET和Visual Studio中单击即可完成这些工作(我正在从.NET移植代码)。我要彻底解决这个问题吗?

最佳答案

我会说是的,从标准可可设计的角度来看,您正尝试以某种错误的方式进行操作,这有两个原因。很抱歉,答案很长,在概念上还有很多事情要做。

首先,当您想知道特定对象已经发生了特定的事情时,目标/动作机制并不是可可中执行此操作的标准方法,除非“发生的事情”是直接的用户动作(例如点击)。连接按钮动作以显示窗口的方式很好;这是用户启动的(按下按钮),因此采取适当的措施。但是要知道第二个窗口已更改状态(变为可见),使用(1)委派或(2)通知会更为典型。这两个都是有用的。在Apple的文档中阅读它们(我相信Google会在这里帮助您)。例如,您可以声明一个对象为第二个窗口的委托,然后当该窗口成为键或主窗口,更改屏幕,关闭窗口等时,它将接收消息-不管您感兴趣的状态如何变化。

但是,这里还有第二个转折。如果查看NSWindowDelegate协议的文档,则会看到诸如windowShouldClose:windowWillClose:之类的委托方法,但没有诸如windowDidOpen:windowDidOrderIn:之类的相应方法。根据您的实际工作,有些委托方法可能对您有用,例如windowDidBecomeKey:windowDidBecomeMain:,甚至甚至是windowDidExpose:,但没有windowDidOpen:或类似方法。我认为这就是Apple向您发送消息:您的代码确实不在乎。因此,除非它们真正代表了您感兴趣的事件,否则您不应使用windowDidBecomeKey:等,而且听起来好像他们没有。相反,您应该通过不包含windowDidOpen:消息来更深入地思考Apple告诉您的内容。他们为什么会遗漏如此明显的代表信息?

这是我的回答。您的第二个窗口已经与第一个窗口位于同一笔尖中,因此已经加载。无论在任何给定的时间是否可见,都是一个细节,明智的做法是避免做出假设,这就是我为Apple的委托设计所做的推测。窗口恢复后可能会自动显示该窗口。它可能是由于应用程序代码之外的某些事物而来来去去的,例如Exposé或Spaces之类的技术,或者Apple决定下一步做什么。并且您可能会在代码中的不同位置使窗口可见。您无需担心此类细节,只需在最后一刻通过代码设置窗口,然后就可以看到它看起来正确了。如果一个窗口在窗口列表中,则在大多数情况下,代码当前不应该关注该窗口当前是否可见。窗口应该保持良好状态,这样很高兴在窗口可见之前无需进行最后的修复即可显示该窗口。根据Apple的设计,您的代码应该担心第一次从笔尖创建窗口的时间,将其设置为正确的状态(为此awakeFromNib)以及窗口关闭的时间(通常是因为,尽管并非总是如此,但关闭窗口后该窗口将不复存在,因此需要进行清理。)– windowWillClose:用于此目的。在这两者之间,您的窗口应保持良好状态。这样做的工作应该非常少,因为除非实际在屏幕上显示窗口,否则所有绘图都将被取消。

因此,当您编写要“根据第一个窗口中的设置对第二个窗口进行一些更改”时,正确的设计可能是响应于第一个窗口中发生的任何更改立即在第二个窗口中进行那些更改。通过连接到任何正在更改的用户界面的操作来检测第一个窗口中的更改,并响应于这些操作,更改第二个窗口。然后,当第二个窗口显示时,您的代码甚至都不需要知道。这是一个更干净的设计;这意味着,例如,如果在显示第二个窗口后第一个窗口进一步更改,则第二个窗口将自动对这些更改做出反应,而“仅在显示第二个窗口之前将其固定一次”设计将无法实现该目的。 。

如果这对于您在应用程序中尝试执行的操作似乎不合适,那么您需要更加确切地了解要实现的目标。我认为,如果两个窗口都位于同一笔尖中,那么根据可可逻辑,这通常是正确的设计。如果您觉得设计错误,那么几乎可以肯定地表明第二个窗口实际上不应与第一个窗口位于同一笔尖中,并且应该为第二个窗口加载新的笔尖,在笔尖完成加载后,导致第二个窗口由加载第二个笔尖的控制器配置。 (或者通过第二个窗口的单独控制器,或者通过awakeFromNib中的第二个窗口本身;根据您的体系结构,这里有很多选项。)

我敦促您不要通过将NSWindow子类化作为另一种建议提出的方法来破解该问题(该答案现已删除,建议将其子类化并覆盖诸如makeKeyAndOrderFront:之类的方法,以便或多或少地对windowDidOpen:进行分类功能)。苹果公司出于某种原因而忽略了windowDidOpen:委托消息。如果只是疏忽大意的监督,那么它会在很多年前被添加。在Cocoa中进行编程的关键是要学会与苹果抗争。通常,可可是一个设计良好的框架(尽管有些类例外:->),如果您学会了使用它而不是与之抗争,那么最终的生活将变得更加轻松。

关于xcode - IBAction使窗口在OS X的 cocoa 中可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33230619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com