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

Ошибка при отключении контроллера просмотра

Получение ошибки при отклонении диспетчера представлений, не видел ничего подобного раньше, и не так много об этом в Интернете.

возникает ошибка: * Ошибка утверждения в - [UIKeyboardTaskQueue waitUntilAllTasksAreFinished],/SourceCache/UIKit/UIKit-2903.2/Keyboard/UIKeyboardTaskQueue.m:368

немного фона, я увольняю контроллер представления после сохранения некоторых данных. данные сохраняются успешно, каждый раз. Кроме того, я недавно изменил код сохранения даты для запуска в основном потоке для этого одного метода, так как у меня были проблемы с сохранением в фоновом режиме.

любые идеи, почему это происходит?

Спасибо заранее.

4b9b3361

Ответ 1

Я получил эту ошибку, когда я вызывал -presentViewController:animated:completion: в потоке, который не был основным потоком (из обратного вызова в сетевом запросе). Решение состоит в том, чтобы отправлять ваши вызовы для представления и увольнения контроллеров представления в основной поток:

dispatch_async(dispatch_get_main_queue(), ^{
    //Code that presents or dismisses a view controller here
});

Ответ 2

У меня была такая же проблема при вызове вида камеры

Синтаксис Swift для той же проблемы:

dispatch_async(dispatch_get_main_queue(), { 
    //Code that presents or dismisses a view controller here  
    self.presentViewController(imagePicker, animated: true, completion: nil)
})

Ответ 3

Обязательно отпустите контроллер представления из представления.

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

Когда приходит время отклонить представленный контроллер представления, предпочтительный подход заключается в том, чтобы позволить диспетчеру представления зрения отклонить Это. Другими словами, по возможности, тот же контроллер представленный диспетчер представлений, должен также взять на себя ответственность за отклоняя его.

Ответ 4

In the target view controller define delegate and protocol:

@class TargetVC;
@protocol TargetVCDelegate <NSObject>
-(void)dismissTargetVC:(TargetVC*)vc;
@end

@interface TargetVC : UIViewController
@property (nonatomic, weak) id<TargetVCDelegate> delegate;
@end

when you done the job at the target view controller call the delegate:
if( [self.delegate respondsToSelector:@selector(dismissTargetVC:)])
{
   [self.delegate dismissTargetVC:self];
}

The implementation of the delegate protocol should be:
-(void)dismissTargetVC:(TargetVC*)vc
{
    [vc dismissViewControllerAnimated:YES completion:nil];

    // you can get relevant data from vc as you still hold reference to it in this block

    // your code ...
}

Ответ 5

Вы должны убедиться, что вызов существующего /dissmissViewController вызван в основной поток, но также вы должны убедиться, что данный /rejectViewController вызывается из одного родительского viewController.

Например, есть два файла navigationController. Первый контроллер детского представления представляет второй ребенок для некоторого задания, которое вернется через делегат (интерфейс). После того, как задание выполняется, второй ребенок отклоняется и вызывает функцию делегирования (интерфейса), чтобы представить другой viweController (например, customPopup) → , который вызывает ошибку, поскольку второй контроллер дочернего представления не отклоняется при вызове текущего всплывающего окна, но уже разобрался, когда вызывается всплывающее окно.

Итак, в этом случае:

  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(400 * NSEC_PER_MSEC)), dispatch_get_main_queue(), { () -> Void in
            if let fs = self.scenarios[indexPath.item]{
                fs.loadScenario()
                sDelegate.onSelectedScenario(fs)
            }
        })

сделает.

Ответ 6

Если у кого-то есть проблема с подтверждением утверждения, вот решение для Swift 3:

OperationQueue.main.addOperation{
    <your segue or function call>
}

Протестировано: Xcode 8.3.2 и Swift 3.1