Xcode 11.4 和 iOS 13.4 打破了 Project 中的 Objective-C 类别

Posted

技术标签:

【中文标题】Xcode 11.4 和 iOS 13.4 打破了 Project 中的 Objective-C 类别【英文标题】:Xcode 11.4 and iOS 13.4 breaks the Objective-C Categories in Project 【发布时间】:2020-03-26 06:31:48 【问题描述】:

我有一个代码库在 Objective-C 中的项目。从 ios 13 开始,由于 modalPresentationStyle 的变化,应用程序变成了 modalStyles 的新行为。由于公司和客户的要求,modalPresentationStyle 应该保持全屏显示。

几个月前为了解决这个问题,我们创建了一个扩展 UIViewController 功能的 Objective-C 类别文件。在这个类中,我们实现了两个方法来继承到项目中的每个 vc 中:

- (UIModalPresentationStyle)modalPresentationStyle

    return UIModalPresentationFullScreen;


- (UIStatusBarStyle)preferredStatusBarStyle

    return UIStatusBarStyleLightContent;

通过将这两种方法添加到 ObjC 类别中,我们只需在此文件中添加此配置一次,它就会自动复制到 VC 中。我们不想在每个vc中都写这个方法,只有在需要添加异常时才写。

这在本周更新之前的版本中对我们有用。

在 Xcode 和 iOS 分别更新到 11.4 和 13.4 后,该类别的行为发生了破坏。现在,视图控制器在实例化时不会自动调用此方法。

我不知道这是否与发行说明的条目有关:

“通过选择文件 > 新建 > 文件创建 Objective-C 类别文件不再创建包含 AppKit 框架导入的文件。(55977950) (FB7346800)”

这破坏了许多需要在未来几天内更新的项目。

【问题讨论】:

你所做的总是不受支持和不可预测的。见developer.apple.com/library/archive/documentation/Cocoa/…。如果现在它不起作用也就不足为奇了。 【参考方案1】:

我也遇到了同样的问题,使用class_replaceMethod可以解决问题。 如果您发布的 xcode 版本不是 11.4,那么这不是问题:

[self swizzleInstanceSelector:NSSelectorFromString(@"modalPresentationStyle") withSelector:@selector(uiviewController_modalPresentationStyle)];
- (UIModalPresentationStyle)uiviewController_modalPresentationStyle 
    return UIModalPresentationFullScreen;

【讨论】:

以上是关于Xcode 11.4 和 iOS 13.4 打破了 Project 中的 Objective-C 类别的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11.4 发布新特性

Xcode 11.4 新特性概览

Xcode 11.4 Objective-C 语言的快速帮助,而不是 swift 语言,用于带有 Cocoapods 的 firebase API(iOS 13.4 应用程序)

如何在 macOS Mojave 10.14.6 上运行 Xcode 11.4

iOS 13.4 模拟器捕获光标问题

Xamarin iOS构建错误-本地链接失败(仅链接框架SDK)