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 Objective-C 语言的快速帮助,而不是 swift 语言,用于带有 Cocoapods 的 firebase API(iOS 13.4 应用程序)