一尘不染

Xcode 7.3中的调试视图层次结构失败

swift

此函数失败,并显示运行时错误:

-[UIWindow viewForFirstBaselineLayout]: unrecognized selector sent to instance 0x7fb9dae257d0

有人遇到过吗?

UPD:
在模拟器iOS 8.1 / 8.4上失败。9.3工作正常。

UPD2: UIWindow创建如下:

window = UIWindow(frame: UIScreen.mainScreen().bounds)    
window?.rootViewController = RootViewController.rootVC
window?.makeKeyAndVisible()

阅读 233

收藏
2020-07-07

共1个答案

一尘不染

通过在项目中放置以下修复程序,我使视图调试器再次工作:

#ifdef DEBUG

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

@implementation UIView (FixViewDebugging)

+ (void)load
{
    Method original = class_getInstanceMethod(self, @selector(viewForBaselineLayout));
    class_addMethod(self, @selector(viewForFirstBaselineLayout), method_getImplementation(original), method_getTypeEncoding(original));
    class_addMethod(self, @selector(viewForLastBaselineLayout), method_getImplementation(original), method_getTypeEncoding(original));
}

@end

#endif

当您的项目加载时,该load方法将执行,如果当前尚未实现,则会导致viewForFirstBaselineLayoutviewForLastBaselineLayout使用该viewForBaselineLayout实现,因此,视图调试使iOS8拥有了所寻找的行为。

要将其添加到您自己的项目中,请在您的项目中创建一个新的空Objective-C文件,然后将内容粘贴到其中。您可以随意命名。我将其称为“ UIView +
FixViewDebugging”。如果您在纯Swift项目中, 无需创建桥接头。该文件将被编译到您的项目中,您无需引用它。

请注意,由于,这仅适用于调试版本#ifdef DEBUG。您可以删除它,但是随后您可能会不小心将其编译到您的发行版本中(尽管它应该没有不良副作用)。如果该方法不适用于这些行,请DEBUG=1在构建设置>
Apple LLVM-预处理>预处理程序宏>调试中检查目标是否具有。

2020-07-07