macOS 开发 - App Delegate 与storyboard、xib

版权声明:本文为博主原创文章,转载请附上本文链接地址。from : https://blog.csdn.net/lovechris00 https://blog.csdn.net/lovechris00/article/details/82285877


零、引言

今天一个群友问,为什么删掉 storyboard 应用就启动不了,就稍对这个研究了下。
一般创建macOS 程序时,可以选择勾选/不勾选 storyboard。(xcode 9.3)
如果不勾选 storyboard 就会默认创建一个 xib。

这里写图片描述


把 storyboard 或者 xib 删掉,app 都无法正常启动,无法走 AppDelegate 文件中的 applicationDidFinishLaunching 方法。


事实也说明,这两个文件中都包含 AppDelegate 的信息。
如果不通过 storyboard 和 xib 指定 AppDelegate 呢?这个我还没找到答案。
下面说说找到的一些细节,也许用得上。


一、storyboard 中的 appDelegate

1、去掉 App Delegate

1、选中 main.storyboard,可以看到右侧面板显示了详细信息。
2、右键选中 Application,可以看到 delegate 信息。
3、删除 delegate 连接的 App Delegate。并再次运行 App,会发现,不走 AppDelegate 文件中的 applicationDidFinishLaunching 方法。

这里写图片描述


2、连接 App Delegate

1、选中 Application,可以看到最右方显示连接信息的面板;
2、将 delegate 选中,并拖拽到 左侧的 App Delegate;
3、再次运行 App, 这时又可以正常走 AppDelegate 文件中的 applicationDidFinishLaunching 方法。

这里写图片描述


二、xib 中的 appDelegate

创建App 时,不勾选 storyboard ,会默认创建一个xib。

1、按照上述方式,查看xib 中的 Application 对象。会发现delegate 中并没有对应的连线。

这里写图片描述


2、选中 File’s Owner,在右侧面板中,可以看到 delegate 的连线;连接的是左侧的delate。
猜想这里便是 设置 App delegate 的地方。连线和取消连线,都会影响 appDelegate 的设置。

这里写图片描述


三、设置 appDelegate 为其他文件

1、探索 delegate 的类。

tableView 的delegate 可以是一个 viewcontroller,也可以是一个view,甚至是一个 object。
那么 appDelegate 也应差不多如此。

在上例 xib 的基础上,选中delegate 连接的那个对象(objects 下面那个文件),可以返现,他是一个 AppDelegate 类型对象。
那么我们可以修改一下他所属的类试试。

这里写图片描述


2、创建类,实现 NSApplicationDelegate 及方法

这里创建了一个类继承自 NSWindowController,并实现 NSApplicationDelegate 及方法applicationDidFinishLaunching

这里写图片描述


3、设置 delegate 为 NSWindowController

修改objects 那个文件的类为刚才创建的 NSWindowController。

这里写图片描述


然后会发现 objects 下那个对象,变成了 window controller。
再次运行app,将会走NSWindowController 中的 applicationDidFinishLaunching 方法。

这里写图片描述


四、Deployment Info 中的 main interface

我们可以创建多个 windowcontroller、viewcontroller、view 来测试 delegate。
会发现,main interface 中只能勾选,创建时同时有 xib 的。
而每一个 xib 中,都有 application 对象。

这里写图片描述


如果设置 main interface 为空,运行则会报错

Failed to connect (window) outlet from (NSApplication) to (NSWindow): missing setter or instance variable

猜你喜欢

转载自blog.csdn.net/lovechris00/article/details/82285877