Блок завершения 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:,

Это, вероятно, причина вашей проблемы.

Другие вопросы по тегам