2015-09-20 15 views
10

Ho ricevuto il seguente errore.UISearchController - Avviso Tentativo di caricare la vista di un controller di vista

tentativo di caricare la visualizzazione di un controller della vista mentre è deallocazione non è consentito e può causare il comportamento indefinito()

provato la seguente soluzione, ma non funziona per me Attempting to load the view of a view controller while it is deallocating... UISearchController

Un progetto demo è disponibile al link.

  1. Toccare il pulsante Aggiungi nel controller Master, aggiungere alcuni timestamp.
  2. Passa da una riga all'altra del controller di visualizzazione Master e vedrai l'errore sopra riportato.

Il codice è illustrato di seguito e può essere scaricato da breve time at.

import UIKit 

class DetailViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UISearchResultsUpdating,UISearchBarDelegate { 

    @IBOutlet weak var basicTable: UITableView!   
    var tblSearchController:UISearchController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib.  
     self.tblSearchController = UISearchController(searchResultsController: nil) 
     self.basicTable.tableHeaderView=self.tblSearchController.searchBar 
//  self.tblSearchController.edgesForExtendedLayout = (UIRectEdge.Top) 
//  self.tblSearchController.extendedLayoutIncludesOpaqueBars = true 
     self.tblSearchController.searchResultsUpdater = self 
     self.tblSearchController.searchBar.delegate = self 
     self.tblSearchController.searchBar.sizeToFit() 
//  self.tblSearchController.searchBar.frame=CGRectMake(0, 0, self.basicTable.frame.size.width, 44.0) 
     self.tblSearchController.hidesNavigationBarDuringPresentation=true 
     self.tblSearchController.dimsBackgroundDuringPresentation=true 
     self.definesPresentationContext=true 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 0 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 0 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let aCell:UITableViewCell! = tableView.dequeueReusableCellWithIdentifier("123") 
     return aCell 
    } 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 
     print("Begin Update = \(NSStringFromCGRect(self.tblSearchController.searchBar.frame)) \(self.tblSearchController.view.frame) ") 
    } 

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) { 
     print("Begin= \(NSStringFromCGRect(searchBar.frame))") 
    } 

    func searchBarTextDidEndEditing(searchBar: UISearchBar) { 
     print("End=\(NSStringFromCGRect(searchBar.frame))") 
    } 
} 
+0

Questo potrebbe non risolvere il problema, ma sarebbe meglio chiamare 'sizeToFit()' e _ poi inserire la barra di ricerca nell'interfaccia. – matt

+0

Ho lo stesso problema. Se trovi la soluzione, per favore pubblicala. – emresancaktar

risposta

6

vedo questo stesso problema, IOS9 notare solo, e anche questo bug report http://www.openradar.me/22250107. Sembra che al momento non ci sia alcuna soluzione.

30

Il problema è un bug in UISearchController in cui tenta di caricare la sua vista nel suo metodo dealloc. Probabilmente chiama self.view e l'autore ha dimenticato che self.view fa sì che la vista venga caricata. Se UISearchController è stato creato ma non è stato utilizzato, non carica la sua vista e si verifica questo problema. Nel tuo progetto di esempio, se tocchi la barra di ricerca, l'avviso non viene visualizzato.

La soluzione è forzare il caricamento della vista. Nel tuo codice ci sono due posizioni che puoi fare: viewDidLoad() o deinit. Utilizzare una delle righe suggerite (loadViewIfNeeded() o _ = .view) non entrambe. Se sei su iOS 9 solo allora probabilmente è meglio usare il codice loadViewIfNeeded in deinit. Se supporti iOS 8, carica la vista manualmente come mostrato.

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.tblSearchController = UISearchController(searchResultsController: nil) 
    // etc. setup tblSearchController  
    self.tblSearchController.loadViewIfNeeded() // iOS 9 
    let _ = self.tblSearchController.view   // iOS 8 
} 

deinit { 
    self.tblSearchController.loadViewIfNeeded() // iOS 9 
    let _ = self.tblSearchController.view   // iOS 8 
} 
+1

Lo stesso errore con UIAlertView. Per risolverlo non creare UIAlertView in viewDidLoad, crearlo prima di utilizzarlo la prima volta. Grazie @PhoneyDeveloper –

+0

Questo sembra essere stato risolto con Xcode 7.3 b2 e iOS 9.3 b2? – Jad

+0

Ho applicato la stessa logica ma anche se l'app si sta bloccando. Sembra essere il suo bug in iOS9 – Ganesh

Problemi correlati