2013-11-16 3 views
17

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

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

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

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

Заранее спасибо.

+0

Любой кто идеи? –

+0

Небольшой код может быть полезен. –

+0

Пожалуйста, разместите код. –

ответ

2

Удостоверьтесь, что вы отключили контроллер вида из представления.

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

When it comes time to dismiss a presented view controller, the preferred approach is to let the presenting view controller dismiss it. In other words, whenever possible, the same view controller that presented the view controller should also take responsibility for dismissing it.

+0

Хорошо, эта логика имеет смысл - как бы я это сделал в коде? –

0
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 ... 
} 
46

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

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

Именно по этой причине я обслуживал обратный вызов на + (void) requestAccessForMediaType: (NSString *) mediaType completeHandler: (void (^) (предоставлен BOOL)) обработчик NS_AVAILABLE_IOS (7_0); и обратный вызов не был основным. – Lee

+0

Я также получаю ту же ошибку. где мне нужно поставить этот код –

+0

, казалось бы, если presentViewController: должен быть вызван в основном потоке, тогда он должен иметь отправку как часть ее внутренней функциональности. Я создал категорию для UIViewController и добавил метод presentViewController: withAnimation: completion: поэтому имя метода будет другим, а затем отправит оригинал, как вы предложили. Похоже на исправление какао. Мы не должны знать или не беспокоиться об этом ограничении presentViewController (только основной поток), и если ограничение будет исправлено, эти детали должны быть захоронены в реализации Cocoa. –

8

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

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

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

Вы должны убедиться, что вызов существующего/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) 
      } 
     }) 

будет делать.

0

Если у кого-то Assertion вопрос Failure, то здесь решение для Swift 3:

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

Проверено на: Xcode 8.3.2 и Swift 3,1

Смежные вопросы