dismissViewControllerAnimated no es disgustar ViewController

Entonces … Tengo un controller de vista y cuando presiono un button, aparece otro controller de vista:

- (IBAction)searchButtonPressed:(id)sender { [self presentViewController:self.controllerSearch animated:YES completion:nil]; } 

Inside view controller number 2 es una vista de tabla y cuando se selecciona una fila en una tabla, este código se ejecuta:

 NSString *phrase = nil; // Document password (for unlocking most encrypted PDF files) NSString *filePath2 = filePath; assert(filePath2 != nil); // Path to first PDF file LazyPDFDocument *document = [LazyPDFDocument withDocumentFilePath:filePath2 password:phrase]; if (document != nil) // Must have a valid LazyPDFDocument object in order to proceed with things { LazyPDFViewController *lazyPDFViewController = [[LazyPDFViewController alloc] initWithLazyPDFDocument:document]; lazyPDFViewController.delegate = self; // Set the LazyPDFViewController delegate to self #if (DEMO_VIEW_CONTROLLER_PUSH == TRUE) [self.navigationController pushViewController:lazyPDFViewController animated:YES]; #else // present in a modal view controller lazyPDFViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; lazyPDFViewController.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:lazyPDFViewController animated:YES completion:NULL]; #endif // DEMO_VIEW_CONTROLLER_PUSH } else // Log an error so that we know that something went wrong { NSLog(@"%s [LazyPDFDocument withDocumentFilePath:'%@' password:'%@'] failed.", __FUNCTION__, filePath2, phrase); } 

Ahora estoy usando LazyPDFKit y viene con este método de delegado:

 - (void)dismissLazyPDFViewController:(LazyPDFViewController *)viewController { // dismiss the modal view controller [self dismissViewControllerAnimated:YES completion:NULL]; } 

Puse un punto de quiebre y puedo ver que mi código entra en el método de delegado, pero LazyPDFViewController no desaparece.

He probado lo siguiente:

 [[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:YES completion:nil]; 

pero eso me lleva de vuelta a unos pocos controlleres de vista.

¿Me estoy perdiendo de algo?

Código adicional en mi primera vista Controlador .h

 @property (strong, nonatomic) UISearchController *controllerSearch; 

y en el primer controller de vista .m

 - (UISearchController *)controller { if (!_controllerSearch) { // instantiate search results table view UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; LHFileBrowserSearch *resultsController = [storyboard instantiateViewControllerWithIdentifier:@"SearchResults"]; // create search controller _controllerSearch = [[UISearchController alloc]initWithSearchResultsController:resultsController]; _controllerSearch.searchResultsUpdater = self; // optional: set the search controller delegate _controllerSearch.delegate = self; } return _controllerSearch; } 

testing esto:

 - (void)dismissLazyPDFViewController:(LazyPDFViewController *)viewController { // dismiss the modal view controller [[viewController presentingViewController] dismissViewControllerAnimated:YES completion:nil]; } 

su código: [[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:YES completion:nil]; simplemente fue demasiado lejos

Si está presionando el controller de vista:

 [self.navigationController pushViewController:lazyPDFViewController animated:YES]; 

Entonces, el código en el delegado no tiene sentido, ya que supone que es un controller de vista modal que debe descartarse:

 - (void)dismissLazyPDFViewController:(LazyPDFViewController *)viewController { // dismiss the modal view controller [self dismissViewControllerAnimated:YES completion:NULL]; } 

Pero lo has agregado a la stack de navigation (supongo).

Si no puede volver a hacerlo desde el controller de navigation, en este momento le falta un código en su ejemplo.

¿Estás seguro de que tu delegado está encendiendo el hilo principal? Tratar:

 - (void)dismissLazyPDFViewController:(LazyPDFViewController *)viewController { dispatch_async(dispatch_get_main_queue(), ^{ [self.navigationController popViewControllerAnimated:YES]; }); } 

Acabo de hacer el proyecto de demostración basado en su situación. Y no estoy enfrentando ningún problema con eso. Entonces, creo que podría haber algún problema con respecto a cómo está presentando el segundo controller.

Haz clic en el button, testing este código:

 - (IBAction)searchButtonPressed:(id)sender { UIStoryboard *main = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; //idSecondVC is the storyboard id of second view controller SecondVC *SecondVC = [main instantiateViewControllerWithIdentifier:@"idSecondVC"]; [self presentViewController:SecondVC animated:YES completion:nil]; } 

Y en su controller número 2, simplemente usé el código anterior:

 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 10; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; cell.textLabel.text = [NSString stringWithFormat:@"Cell %ld",indexPath.row]; return cell; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self openLazyPDF]; } - (void)openLazyPDF { NSString *phrase = nil; // Document password (for unlocking most encrypted PDF files) NSArray *pdfs = [[NSBundle mainBundle] pathsForResourcesOfType:@"pdf" inDirectory:nil]; NSString *filePath = [pdfs firstObject]; assert(filePath != nil); // Path to first PDF file LazyPDFDocument *document = [LazyPDFDocument withDocumentFilePath:filePath password:phrase]; if (document != nil) // Must have a valid LazyPDFDocument object in order to proceed with things { LazyPDFViewController *lazyPDFViewController = [[LazyPDFViewController alloc] initWithLazyPDFDocument:document]; lazyPDFViewController.delegate = self; // Set the LazyPDFViewController delegate to self #if (DEMO_VIEW_CONTROLLER_PUSH == TRUE) [self.navigationController pushViewController:lazyPDFViewController animated:YES]; #else // present in a modal view controller lazyPDFViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; lazyPDFViewController.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:lazyPDFViewController animated:YES completion:NULL]; #endif // DEMO_VIEW_CONTROLLER_PUSH } else // Log an error so that we know that something went wrong { NSLog(@"%s [LazyPDFDocument withDocumentFilePath:'%@' password:'%@'] failed.", __FUNCTION__, filePath, phrase); } } #pragma mark - LazyPDFViewControllerDelegate methods - (void)dismissLazyPDFViewController:(LazyPDFViewController *)viewController { // dismiss the modal view controller [self dismissViewControllerAnimated:YES completion:NULL]; } 

Y para mí todo está funcionando bien.

Parece que necesita la misma macro para el presente como despedir. Entonces escribiste

 #if (DEMO_VIEW_CONTROLLER_PUSH == TRUE) [self.navigationController pushViewController:lazyPDFViewController animated:YES]; #else // present in a modal view controller lazyPDFViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; lazyPDFViewController.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:lazyPDFViewController animated:YES completion:NULL]; #endif // DEMO_VIEW_CONTROLLER_PUSH 

Entonces necesitas

 #if (DEMO_VIEW_CONTROLLER_PUSH == TRUE) [self.navigationController popViewControllerAnimated:YES]; #else // presented in a modal view controller [self dismissViewControllerAnimated:YES completion:NULL]; #endif // DEMO_VIEW_CONTROLLER_PUSH 

Es posible que haya desconectado el hilo principal y siempre puede agregar una afirmación para verificar o, como se ha sugerido, usar un dispatch_async para estar seguro.

NSAssert([NSThread isMainThread)];

Prefiero el aserto, cuando conozco todos los flujos a través de un código, ya que muestra mis supuestos para el futuro yo (u otro) y no sale del código que parece que sabe algo que no hago (oh, están usando dispatch_async en main, por lo que debe haber alguna otra magia de subprocesss que vaya más abajo).

 - (void)dismissLazyPDFViewController:(LazyPDFViewController *)viewController { if (![NSThread isMainThread]) { dispatch_async(dispatch_get_main_queue(), ^ { [self dismissLazyPDFViewController:viewController]; }); return; } if (viewController.navigationController) { [viewController.navigationController popViewControllerAnimated:YES]; } else { [viewController dismissViewControllerAnimated:YES completion:nil]; } }