ios - 在 Mac Catalyst 中使用 applicationShouldTerminateAfterLastWindowClosed
问题描述
我有一个 Mac Catalyst 应用程序,它本质上是一个单窗口应用程序,但我添加了多窗口支持(使用场景)以允许为一个功能打开第二个窗口,一小部分用户将使用该功能。现在,Apple 拒绝了该应用程序,因为它支持多窗口,当用户单击主窗口顶部的红色按钮时,该应用程序不会退出。一种解决方案是提供一个菜单项来重新打开它,但我认为如果应用程序像以前那样简单地退出,对用户来说会更直观。
我在 Apple 论坛上发现了类似的问题,并正在尝试实施提供的解决方案。使用提供更多设置说明的本教程,我添加了一个 macOS 包作为新目标,将其嵌入到 iOS 目标中,并将此类添加到包中:
#import "AppKitBridge.h"
@implementation AppKitBridge
@synthesize application;
@synthesize window;
- (id)init {
NSLog(@"AppKitBridge init");
self = [super init];
self.application = [NSApplication sharedApplication];
self.window = [[self.application windows] firstObject];
if (self.window) {
self.application.delegate = self;
self.window.delegate = self;
} else {
NSLog(@"AppKitBridge error: window is nil");
}
return self;
}
- (void)test {
NSArray *windows = NSApplication.sharedApplication.windows;
for (NSWindow *window in windows) {
NSLog(@"AppKitBridge window: %@", window);
}
}
- (void)applicationDidUpdate:(NSNotification *)notification {
NSLog(@"AppKitBridge applicationDidUpdate");
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
NSLog(@"AppKitBridge applicationShouldTerminateAfterLastWindowClosed");
return TRUE;
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
NSLog(@"AppKitBridge applicationShouldTerminate");
return TRUE;
}
@end
然后在 iOS 应用的初始视图控制器的 viewDidLoad 中,我调用这个方法来加载包:
- (void)enableAppKit {
NSString *pluginPath = [[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingPathComponent:@"AppKit.bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:pluginPath];
[bundle load];
NSObject *appKit = [[[bundle classNamed:@"AppKitBridge"] alloc] init];
[appKit performSelector:@selector(test) withObject:nil afterDelay:0];
}
当我运行应用程序时,控制台显示AppKitBridge init
,AppKitBridge window
和AppKitBridge applicationDidUpdate
行。所以看起来整体设置是有效的。但是当我单击红色窗口按钮时,它不显示AppKitBridge applicationShouldTerminateAfterLastWindowClosed
或AppKitBridge applicationShouldTerminate
线,并且应用程序没有退出。
这是否应该符合我的预期,如果是这样,我在设置中缺少什么?
解决方案
问题是这一行:
NSObject *appKit = [[[bundle classNamed:@"AppKitBridge"] alloc] init];
您的appKit
对象是一个局部变量,因此您的 AppKitBridge 实例会在一行之后消失。如果要充当应用程序/窗口委托,您需要此对象持久存在。将其分配给某个持久对象的实例属性。
推荐阅读
- python - 连接到 Python websockets 时出现 Ktor MalformedInputException
- python - 从 Google 云存储桶运行 Eleuther AI GPT 模型
- smooth-scrolling - 加载巨大列表时 Flutter ListView.separated 帧丢失
- c# - docker api 和 web 应用程序容器的问题
- php - jetstream 不更新功能(在 config/jetstream.php 上)
- python - 为什么函数会出错?不和谐.py
- bash - BASH循环从其他csv更改1个csv的数据
- jquery - 固定侧边栏在引导程序 5 中的玻璃网站中不起作用
- build - 了解 bitbake 默认任务
- javascript - 使用 Array#sort 对 HTML 表进行排序