Essayer de charger la vue d'un point de vue contrôleur alors qu'il est de la désallocation... UISearchController
J'ai du code qui crée un UISearchController' in my UIVIew's
viewDidLoad`.
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.searchBar.delegate = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.hidesNavigationBarDuringPresentation = false //prevent search bar from moving
controller.searchBar.placeholder = "Search for song"
self.myTableView.tableHeaderView = controller.searchBar
return controller
})()
Juste après cette fermeture finitions, cet avertissement s'affiche dans la console:
Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UISearchController: 0x154d39700>)
Je ne comprends pas ce que je fais de mal. Cette question similaire n'est pas vraiment ma situation (Au moins je ne le pense pas). Ce qui se passe?
- xkcd.com/583 Fonctionne ok si je jeter que dans ma Table VC
viewDidLoad()
. Recommander a) y compris l'ensemble de la CR de la source de cotation et b) veiller à ce que l'erreur qui se passe vraiment où et quand vous pensez qu'il est. - Aussi, faire plus de recherche tels que: stackoverflow.com/questions/31006045/... qui a la même erreur
- Alors, j'ai fait rapidement un projet, n'a tout progrmatically, pas de story-boards, et je n'ai aucun problème, est-ce un storyboard du problème que vous rencontrez, peut-être, je ne sais pas, mais je suppose que vous êtes en utilisant des story-boards, droit? Quand je dis de la programmation, je ne veux pas de plumes, pas de story-boards, l'ensemble du code et il fonctionne très bien
- J'ai mis un point d'arrêt avant
})()
et après})()
. L'erreur est lancée après la fermeture se termine. J'ai unUIViewController
, pas untableViewController
. - J'ai un storyboard. Elle ne contient qu'une manette de Navigation et un UIViewController (ils sont connectés.)
- Juste une remarque: il n'y a aucune raison d'utiliser une fermeture ici.
Vous devez vous connecter pour publier un commentaire.
UISearchController de vue doit être retiré de son superview avant de les libérer. (suppose que c'est un bug)
Objective-C...
Swift 3...
J'ai du mal avec ce problème pour un couple de semaines. ^^
UISearchControler
j'étais répartition en-viewDidLoad
. C'est certainement un bug - si leUISearchController
est libéré avant son point de vue est chargé, cet avertissement apparaît. Si je tape dans le champ de recherche (de ce fait, le chargement de la vue), il n'apparaît pas. Donc, à mondealloc
, j'appelle[self.searchController loadViewIfNeeded]
(nouveau dans iOS 9),if #available(iOS 9.0, *) { self.searchController?.loadViewIfNeeded() }
[self.searchController loadViewIfNeeded];
(Obj-C) est la réponse qui a résolu le problème dans mon code.loadViewIfNeeded
supprimer cette alerte, je recommande d'utiliser l'approche de @JJH réponse.Résolu! C'était un simple correctif. J'ai changé ce code
à ceci:
Cela résout le problème.
Ici est la Swift version qui a fonctionné pour moi (similaire toJJHs réponse):
if let
depuis.removeFromSuperView()
ne rien faire sisuperview == nil
De piratage, ainsi que quelques solutions que j'ai réussi à obtenir le mien de travail par l'ajout de lignes pour viewDidLoad avant entièrement de la configuration de l'UISearchController:
self.searchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.searchBar.delegate = self definesPresentationContext = true controller.searchBar.sizeToFit() return controller })()
puisself.searchController.loadViewIfNeeded()
Dans Swift2 j'ai eu le même message d'erreur dû à un bug évident:
Cause d'une stupide erreur de copie de moi-même, je n'avais pas compris l'auto.presentViewController ligne. Cela a provoqué la même erreur.
Dans Swift 2.2 version qui a fonctionné pour moi
Je pense que c'est utile!
Le mien est de travailler comme cela
searchController.loadViewIfNeeded() résout le problème, mais vous devez appeler après l'initialisation de la searchController
La création d'un contrôleur de recherche dans
viewDidLoad()
et la fixation de sa barre de recherche comme l'élément de navigation de titre de la vue n'est pas de créer une référence forte à la recherche d'un contrôleur, qui est pourquoi il est libéré.Donc au lieu de cela:
Ce faire, vous devez:
J'ai utilisé de Derek réponse, mais a dû changer un peu.
La réponse qui a été fournie s'est écrasé pour moi, parce que l'appel à loadViewIfNeeded() qui est arrivé avant le resultSearchController a été défini. (Ma déclaration a été
). Donc, je viens de déménager par la suite et cela a fonctionné.
Si j'ai laissé de côté l'appel en totalité, le bug est resté, donc je suis sûr que c'est une partie essentielle de la réponse. Je n'ai pas pu le tester sur iOS 8.
Ce n'est pas un bug. Il semble que vous avez pour éviter de créer des ViewControllers sans présentation. Ainsi, après
SomeViewController()
oulet variable: SomeViewController
vous devez appeler quelque chose comme celaself.presentViewController(yourViewController ...etc)
. Si vous ne le faites pas, vous obtiendrez cet avertissement lors de ce point de vue contrôleur sera dealocated.Il semble que la vue n'est pas chargé, si vous avez réservé le contrôleur et de ne jamais le montrer, la vue n'est pas chargé. Dans ce cas, si le contrôleur est libéré, vous aurez reçu cet avertissement. vous pourriez montrer une fois, ou appelez ça loadViewIfNeed() la méthode ou l'utilisation de 'let _ = contrôleur.la vue' à force de charger la vue pour éviter cet avertissement.
Je suis un peu en retard à la fête, mais voici ma solution:
J'espère que cela fonctionne pour vous.