web-dev-qa-db-fra.com

blocage iOS UISearchController: une application a tenté de présenter le contrôleur de vue modal sur lui-même

Selon crashlytics, le crash suivant se produit (rarement). 

L'application a essayé de présenter le contrôleur de vue modale sur lui-même. Le contrôleur de présentation est.

Je ne peux pas reproduire ce problème du tout. Voici comment j'ai configuré mon contrôleur UISearch.

    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.searchController.searchBar.delegate = self;

    self.tableView.tableHeaderView = self.searchController.searchBar;
    self.definesPresentationContext = YES;

Toute aide est appréciée parce que je suis à court d’idées. Je posterai plus de code si nécessaire.

7
Curt Rand

J'avais ce problème lorsque j'ai mis à jour iOS 11. Mon scénario était que j'avais un champ de texte, et lorsque l'utilisateur a commencé à l'éditer, une vue de recherche, essentiellement une vue de table avec une barre de recherche comme en-tête est apparue. et une fois qu'une cellule tableview a été exploitée, elle devrait fermer.

Le problème semble être que, depuis iOS 11, le système d'exploitation tente de restaurer l'état du premier répondeur. Longue histoire courte.

Cela a aidé quand j'ai ajouté active = NO, à ma méthode de sélection, comme ça

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   self.searchController.active = NO; // Add this !
   ...

   [self dismissViewControllerAnimated:YES completion:nil];
}
15
Kastor

Si vous êtes comme moi et que vous avez besoin que le searchController reste actif tout en présentant modalement un autre contrôleur, procédez comme suit pour obtenir le même effet que pour une présentation modale sans le faire directement:

Note rapide: Pas assez familier avec Obj-C pour y répondre, mais voici une réponse dans Swift 4. Quelqu'un se sent libre de modifier et d'ajouter Obj-C si nécessaire, mais je pense qu'il est clair ici comment résoudre le problème à main, même si c'est dans Swift.

Disons que j'ai un menu que je veux faire apparaître:

let info = the info you need to pass
let currVC = self.getTopMostViewController()
let menuVC = currVC.storyboard?.instantiateViewController(withIdentifier: "myStringIdentifierSetInStoryboard") as? EventMenuViewController
guard menuVC != nil else { return }
menuVC!.info = info // Pass info necessary (i.e. what you would normally pass in prepare(for segue: ...). menuVC.info is a global variable from your class
currVC.present(menuVC!, animated: true, completion: nil)

L'implémentation de getTopMostViewController () peut varier. Le mien est en bas et est adapté de ici .

func getTopMostViewController() -> UIViewController {
    let anyVC = UIViewController()
    if var topController = UIApplication.shared.keyWindow?.rootViewController {
        while let presentedViewController = topController.presentedViewController {
            topController = presentedViewController
        }
        return topController
    }
    return anyVC
}

J'espère que cela t'aides! Cela ne vous donne pas l’erreur décrite pour iOS 12 et Swift 4, bien que j’ai eu cette erreur exacte lors de la présentation modale avec un contrôleur de recherche actif, c’est ce qui m’a amené ici.

1
Josh Wolff