Подтвердить что ты не робот

Иерархия представления отладки в Xcode 7.3 не выполняется

Эта функция выходит из строя с ошибкой времени выполнения:

-[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()
4b9b3361

Ответ 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 будет выполняться, заставляя viewForFirstBaselineLayout и viewForLastBaselineLayout использовать реализацию viewForBaselineLayout, если они в настоящее время не реализованы, поэтому просмотр отладки вызывает вкус iOS8, который он искал.

Чтобы добавить это в свой собственный проект, создайте в своем проекте новый пустой файл Objective-C и вставьте содержимое. Вы можете назвать его, как хотите. Я называю мой "UIView + FixViewDebugging". Если вы находитесь в чистом проекте Swift, вам не нужно создать заголовок моста. Файл будет скомпилирован в ваш проект, и вам не нужно ссылаться на него.

Обратите внимание, что это будет работать только для отладочных сборников из-за #ifdef DEBUG. Вы можете удалить его, но затем вы можете случайно скомпилировать это в своих версиях (хотя у него не должно быть никаких побочных эффектов). Если этот метод не работает с этими строками, проверьте, что ваша цель имеет DEBUG=1 в настройках сборки > Apple LLVM - предварительная обработкa > макросы препроцессорa > отладка.

Ответ 2

Похоже, что Xcode 7.3 использует свойство viewForFirstBaselineLayout для рисования пользовательского интерфейса. Но это свойство помечено как доступно с iOS 9.0.

Снимок экрана с UIView.h

[UIView viewForFirstBaselineLayout] должен использоваться для версии до iOS 9.0. Кажется, ребята из Apple не рассматривали этот случай.

Ответ 3

Да. при нажатии кнопки иерархии просмотра отладки на странице ничего нет, и напечатайте "[UIWindow viewForFirstBaselineLayout]: нераспознанный селектор отправлен в экземпляр 0x7fb9dae257d0".

Чтобы решить эту проблему, просто убедитесь, что вы используете систему iOS не ниже iOS 9.0, и вы все равно будете использовать эту функцию свободно.