Блок завершения presentViewController не выполняется
У меня странная проблема, завершение блока из presentViewController
не выполняется в последнее время. Этот код вызывается при нажатии кнопки
DebugViewController * x = [[DebugViewController alloc] init];
x.view.backgroundColor = [UIColor redColor];
[self presentViewController:x animated:YES completion:^{
NSLog(@"Hello world %@" , self );
}];
DebugViewController
этот класс, self
это UIViewController
в такой структуре: JASidepanels
---> (центральная панель) UINavigationController
---> self
Как и ожидалось, точно такой же код работает в любом другом проекте, но он не работает в моем уже несколько недель. Я недавно добавил JASidePanels
и некоторые другие стручки.
Вот что наверняка знаю:
- представлен модал, вызываются viewWillAppear и viewDidAppear, он оживляет, работает правильно
- viewWillDisappear вызывается при представлении VC, Deloc - нет, поэтому он активен.
- Другие блоки работают.
- Это в главной теме
Любая идея, как я могу отладить, почему блок не выполняется для меня?
Редактировать: Вау, это очень странно. Я отлаживал целый день и постарался удалить код построчно. Однако, кажется, я нашел что-то действительно интересное. Если на любом из моих viewcontrollers есть свойство с именем точно currentAction
(что имеет место в одном из моих VC), блоки завершения не будут выполняться во всем приложении! Может кто-нибудь подтвердить, пожалуйста? Вот суть GIST, измените его на currentAction
,
2 ответа
Если в каком-либо из моих viewcontrollers есть свойство с именем именно currentAction, блоки завершения не будут выполняться во всем приложении! Может кто-нибудь подтвердить, пожалуйста?
Это, вероятно, потому что UIViewController
имеет переменную экземпляра под названием _currentAction
, как вы можете видеть в этой части UIViewController.h:
id _dimmingView;
id _dropShadowView;
id _currentAction;
UIStoryboard *_storyboard;
Объявление свойства под названием currentAction
и использование синтеза по умолчанию для методов доступа будет мешать этому ивару. Чтобы избежать этого, явно синтезируйте методы доступа и предоставьте другое имя для ивара для поддержки вашего свойства. Попробуйте добавить такую строку в ваш класс:
@synthesize currentAction=_myCurrentAction;
Это может помочь вам избежать вмешательства в существующий ivar, если UIViewController имеет доступ только к _currentAction
напрямую и не использует какой-либо внутренне объявленный метод доступа или KVC.
Не используйте alloc/init для создания контроллера представления. Ether загружает его из раскадровки, используя instantiateViewControllerWithIdentifier:
или загрузите его из пера с помощью initWithNibName:bundle:
,
Это, вероятно, причина вашей проблемы.