此函数失败,并显示运行时错误:
-[UIWindow viewForFirstBaselineLayout]: unrecognized selector sent to instance 0x7fb9dae257d0
有人遇到过吗?
UPD: 在模拟器iOS 8.1 / 8.4上失败。9.3工作正常。
UPD2: UIWindow创建如下:
UIWindow
window = UIWindow(frame: UIScreen.mainScreen().bounds) window?.rootViewController = RootViewController.rootVC window?.makeKeyAndVisible()
通过在项目中放置以下修复程序,我使视图调试器再次工作:
#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方法将执行,如果当前尚未实现,则会导致viewForFirstBaselineLayout并viewForLastBaselineLayout使用该viewForBaselineLayout实现,因此,视图调试使iOS8拥有了所寻找的行为。
load
viewForFirstBaselineLayout
viewForLastBaselineLayout
viewForBaselineLayout
要将其添加到您自己的项目中,请在您的项目中创建一个新的空Objective-C文件,然后将内容粘贴到其中。您可以随意命名。我将其称为“ UIView + FixViewDebugging”。如果您在纯Swift项目中, 则 无需创建桥接头。该文件将被编译到您的项目中,您无需引用它。
请注意,由于,这仅适用于调试版本#ifdef DEBUG。您可以删除它,但是随后您可能会不小心将其编译到您的发行版本中(尽管它应该没有不良副作用)。如果该方法不适用于这些行,请DEBUG=1在构建设置> Apple LLVM-预处理>预处理程序宏>调试中检查目标是否具有。
#ifdef DEBUG
DEBUG=1