PerformSelector выдает исключение UIViewControllerHierarchyInconsistency.

Я разрабатывал свое приложение на XCode 4.1 для iOS 4.3, но вчера я обновил его до XCode 4.2 с помощью SDK для iOS 5.0.

Когда я запускаю свое приложение в симуляторе iphone 4.3, оно отлично работает. Я решил протестировать его на симуляторе iphone 5.0, и возникли следующие проблемы:

  • У меня есть контроллер представления, например «MyViewController», и пользовательский класс, который реализует некоторый пользовательский компонент «MyCustomComponent», который добавляется в «MyViewController». В MyCustomComponent есть кнопка, и когда ее коснулись, она peformSelector из MyViewController, и это приводит к сбою с EXC_BAD чем-то. Тот же код отлично работает на симуляторе iPhone 4.3. Любые идеи?
  • Пользовательская панель навигации - вообще не работает. Я пытаюсь установить собственный фон, реализующий UINavigationBar и переопределяющий drawRect, но он не отображается в ios 5.

person Drabuna    schedule 13.10.2011    source источник
comment
Исправлена ​​панель навигации weston-fl.com/blog/?p=3024.   -  person Drabuna    schedule 13.10.2011
comment
Хорошо, значит, я понял это. Моя консоль была выключена, когда я переустанавливал xcode, поэтому не видел никаких сообщений об ошибках. Включил его сейчас и получил сообщение об ошибке Завершение приложения из-за необработанного исключения «UIViewControllerHierarchyInconsistency». Проблема заключалась в том, что я добавлял MyCustomComponent в MyViewController, используя self.view=myCustomComponent.view, когда я должен был делать [self.view addSubview:myCustomCoponent.view], это не было проблемой в ios 4.3, но кажется, что это большое дело в айос 5.   -  person Drabuna    schedule 13.10.2011


Ответы (3)


Хорошо, значит, я понял это. Моя консоль была выключена, когда я переустанавливал xcode, поэтому не видел никаких сообщений об ошибках. Сейчас включил, выдает ошибку

Завершение работы приложения из-за необработанного исключения "UIViewControllerHierarchyInconsistency"

Проблема заключалась в том, что я добавлял MyCustomComponent в MyViewController, используя

self.view=myCustomComponent.view

когда я должен делать

[self.view addSubview:myCustomCoponent.view]

Это не было проблемой в iOS 4.3, но, похоже, это большая проблема в iOS 5.

person Drabuna    schedule 15.10.2011

Я боролся с той же проблемой.

Когда вы создаете новое приложение Master-Detail (без раскадровки), вы можете увидеть эти коды ниже на AppDelegate.m.

 MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];

«НЕ ЗАВИСИМ ОТ MainWindow» Просто начните с вашего собственного ViewController и установите его для делегирования. И не забудьте отвязать представление от MainWindow.xib, иначе представление будет вызываться 2 раза.

person KJLucid    schedule 17.10.2011

EXC_BAD_ACCESS подразумевает, что объект не существует. Попробуйте NSLog-ging объект, на котором вы выполняете метод PerformSelector.

РЕДАКТИРОВАТЬ: Если он падает, когда вы пытаетесь его зарегистрировать, он был освобожден. Проверьте, правильно ли вы удерживаете объект!

Если это допустимый объект, попробуйте:

if(![obj respondsToSelector:@selector(mySelector:)]){NSLog(@"no such method!");}
person oskob    schedule 13.10.2011
comment
Отправка сообщения nil в Objective-C невозможна. - person Nikolai Ruhe; 13.10.2011
comment
Объект действителен, и объект отвечает на селектор, но я все еще получаю сбои на pefformSelector((( - person Drabuna; 13.10.2011
comment
Консоль ничего не говорит? - person oskob; 13.10.2011
comment
Нет, просто SIGABRT, вот и все. - person Drabuna; 13.10.2011