- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有按钮的窗口。当我单击按钮时,它将打开另一个窗口(两个窗口都在同一个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/
我正在观看来自 iTunes U. 的视频讲座,其中讲师展示了如何使用 Xcode 的调试器部分并能够将该窗口从主窗口拉开。 不幸的是,视频显示了如何在 Xcode3 中执行此操作的说明。如何在 Xc
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
我真的厌倦了其他用户的项目错误,因为 XCode 的默认类引用类型是“相对于 XCode 文件夹”。我知道您可以将其更改为“相对于封闭组”,这就是我们的项目,但是任何时候有人创建一个新的类文件并且忘记
我对 Xcode 一无所知,除了它是来自 Apple 的开发人员界面,它实际上来自 OSX CD,它也用于创建 iPhone 应用程序。 我也知道它有一个 Applications 文件夹,里面装满了
更新 Xcode(从 7.2 到 7.2.1)后,XcodeServer 无法运行 Xcode Service。当我选择更新的 Xcode 时,提示消息:Enable Accessibility ac
我很难找到有关新 XCode 布局的信息。如何查看源文件的反汇编,而不仅仅是 C++ 代码? 最佳答案 在 Xcode 4.2(和 Xcode 5)中,您可以通过以下方式查看文件的汇编或反汇编: 显示
我在 XCode 中为我的项目添加了一个文件夹并将其命名为 Themes,它将用于存储我的 iPad 应用程序的主题。在那下面我有红色、蓝色等等。 它们出现在 XCode 中。但是当我查看物理文件夹时
作为我之前 How can I create a reference cycle using dispatchQueues? 的后续: 对于强引用(会造成泄漏,但不是循环引用),例如Timer、Dis
我有一台 macbook air,我去商店安装 Xcode 7.3 并点击更新 App 按钮,然后出现了一个加载图标,但等待 30 分钟后什么也没发生。我从商店成功安装了 simple recorde
我的项目现在有一个project.xcworkspace/xcshareddata目录。 Xcode在project.xcworkspace/xcshareddata目录中存储什么? 最佳答案 xcs
我不经常使用 XCode 进行开发,最近 MacPorts 告诉我我需要获得 3.1 才能使包工作。我去了苹果,他们为我提供了最新版本,结果只适用于 OSX 6。因为我有 OSX 5,它对我没有任何帮
有谁知道如何强制 Xcode 停止运行。我更新到 6.2 但现在它不能正常工作。我需要退出 Xcode 才能完成更新或卸载并重新安装。菜单中的相当 Xcode 不可用。无法将其拖到垃圾箱,因为它说它仍
我最近从我的项目中删除了一些旧的测试类并删除了文件。正如预期的那样,文件被移到垃圾箱并在 git 中显示为已删除。 不幸的是,测试类和它们定义的测试用例继续出现在测试导航器中。我已经尝试过常见的疑点,
Xcode 中的场景编辑器显示大小但不显示单位。它是以英寸为单位的尺寸还是以米为单位的尺寸? 例如,当我选择一个节点时,例如一个盒子,当我在节点检查器中检查它的属性并在“边界框”旁边的“变换”部分检查
只想知道 xcode 项目中事件可执行文件的目的是什么? 谢谢 索拉布 最佳答案 自己找到了..希望它会帮助某人。 您可以在其中运行和测试软件产品的可执行环境。可执行环境定义了应该用来运行产品的程序。
刚回到我的办公 table ,Xcode 一直在文件中突出显示/强调空白区域。如果我输入一些东西它就会消失,但如果我切换标签并回来,它们会重新出现。 更新:这不是由“显示隐形”选项引起的。那看起来不一
我首先注意到这一点 Cmd-/偶尔拒绝为注释取消注释的代码行工作。但是现在(刚刚使用 XCode 4.1,虽然这可能无关)它发生在 Cmd-B建立。 我无法弄清楚我正在做什么导致这种情况,或者是否有任
我不太了解Xcode 4的工作区的实用程序。它们的用途是什么,它们如何帮助Xcode进行开发? 最佳答案 例如。您有一个在两个应用程序中使用的库。您很可能为此库拥有一个自己的项目,对吗?现在,您可以自
我正在关注一个应用程序教程,它说: “接下来,在 Xcode 应用程序项目目录的根目录下创建一个空文件,并调用该文件 Podfile。使用您喜欢的文本编辑器打开它,然后在其中粘贴以下行:” 我很困惑这
我是一名优秀的程序员,十分优秀!