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

21

这个函数会出现运行时错误:

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

有人遇到过相同的问题吗?

更新:
在模拟器 iOS 8.1/8.4 上失败。9.3 版本可以正常工作。

更新2: UIWindow 的创建方式如下:

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

你到底要如何处理 UIWindow - holex
完全没有任何交易。用户界面检查器自己失败了。 - orkenstein
我现在也遇到了同样的问题,正在寻找解决方案。 - Jagie
@orkenstein,你遇到这个异常是在哪个iOS版本上? - holex
你尝试过在设备上进行测试吗(例如iPhone)? - wolfrevo
显示剩余4条评论
3个回答

21

我通过在我的项目中添加以下修复程序,使视图调试器再次正常工作:

#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。您可以删除它,但那样可能会意外地将其编译进发布版本中(尽管不应产生任何不良副作用)。如果此方法与这些行一起不能正常工作,请检查您的目标是否已在Build Settings> Apple LLVM-预处理>预处理器宏> Debug中设置了DEBUG = 1

2
即使在模拟器9.3(13E230)中,无论是否进行了上述混淆操作,Xcode 7.3.1(7D1014)仍然存在问题。 - verec
在XCode 7.3.1上对我有效。 - PDaria
在我的XCode 7.3.1,iPhone 6s iOS 9.3.2上没有起作用。 - Jarrod Smith
1
这段代码可能无法正常工作,当你(就像我一样)没有启用DEBUG标志时。移除#ifdef #endif可能会解决你的问题。 - Matthieu Riegler
@MatthieuRiegler 谢谢,我已经把它加入到我的答案中了。 - Brian Nickel
非常感谢!在 Xcode 7.3.1 和 iOS 8.1 模拟器上完美运行。 - iosdude

21

看起来Xcode 7.3使用viewForFirstBaselineLayout属性来绘制UI。但是该属性标记为自iOS 9.0以来可用。

UIView.h的屏幕截图

在iOS 9.0之前的版本应该使用[UIView viewForFirstBaselineLayout]方法。似乎苹果的开发人员没有考虑到这种情况。


没错,一旦我切换到 iOS 8 模拟器,就会出现错误,但是一旦切回 iOS 9,错误就消失了。 - bubuxu

0

是的。当点击调试查看层次结构按钮时,页面上什么也没有,并打印出“[UIWindow viewForFirstBaselineLayout]: unrecognized selector sent to instance 0x7fb9dae257d0”的错误信息。

要解决这个问题,只需确保您使用的是iOS 9.0及以上版本的系统,您就可以自由地继续使用该功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接