Catalyst中自定义类内buildMenuWithBuilder方法无法调用问题
以下是针对你代码问题的排查点和解决方案:
1. 确保应用实际使用RNCatalystMenu作为委托类
你的RNCatalystMenu继承自AppDelegate,但如果项目仍使用原AppDelegate作为UIApplication的委托,这个类的方法永远不会被调用。
- 打开
Info.plist,找到Principal class项,将其值改为RNCatalystMenu - 或者在
main.m中修改启动代码,将委托设置为RNCatalystMenu实例:
int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([RNCatalystMenu class])); } }
2. 重写方法时调用父类实现
buildMenuWithBuilder:是UIResponder的方法,重写时需要先调用父类的实现,保证菜单构建的基础流程正常执行:
- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder { [super buildMenuWithBuilder:builder]; // 必须先调用父类方法 [builder removeMenuForIdentifier:UIMenuEdit]; [builder removeMenuForIdentifier:UIMenuFormat]; [builder removeMenuForIdentifier:UIMenuHelp]; }
3. 检查iOS版本兼容性
buildMenuWithBuilder:是iOS 13.0及以上才支持的API,如果你的项目部署目标低于iOS 13,这个方法不会被系统调用。需要在项目设置中确认Deployment Target为iOS 13.0+。
4. 验证菜单标识符有效性
在Catalyst环境中,部分系统菜单的标识符可能存在差异,你可以先打印所有现有菜单的标识符来确认:
- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder { [super buildMenuWithBuilder:builder]; // 打印所有菜单标识符 for (UIMenu *menu in builder.menus) { NSLog(@"Menu Identifier: %@", menu.identifier); } // 再执行移除操作 [builder removeMenuForIdentifier:UIMenuEdit]; [builder removeMenuForIdentifier:UIMenuFormat]; [builder removeMenuForIdentifier:UIMenuHelp]; }
你的原始代码参考
.h文件
#import "AppDelegate.h" NS_ASSUME_NONNULL_BEGIN @interface RNCatalystMenu : AppDelegate @end NS_ASSUME_NONNULL_END
.m文件
#import "RNCatalystMenu.h" @implementation RNCatalystMenu : AppDelegate - (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder { [builder removeMenuForIdentifier:UIMenuEdit]; [builder removeMenuForIdentifier:UIMenuFormat]; [builder removeMenuForIdentifier:UIMenuHelp]; } @end
内容的提问来源于stack exchange,提问作者Jerry Seigle
相关产品推荐
相关产品推荐

