2015-10-22 24 views
5

Ho uno strano problema in iOS 9 con Swift 2.0. Ho aggiunto UISearchController nel mio tableViewController ma provoca uno strano problema schermata nera. Quando premo la barra di ricerca e scrivo qualcosa mostra i miei risultati filtrati senza problemi ma quando tocco un altro tasto della barra delle tabulazioni come Segnalibri e successivamente quando tocco TableViewController che è Il più visualizzato di nuovo mostra una schermata nera come una schermata .UISearchController causa la schermata nera Swift 2.0

C'è il mio tableViewController;

import UIKit 

class CitiesTableViewController: UITableViewController, UISearchResultsUpdating { 

// MARK: - Class Properties 

private var cities = [String]() 
private var veterinaries = [Veterinary]() 
private var filteredVeterinaries = [Veterinary]() 
private var resultSearchController: UISearchController! 

// MARK: - TableViewController Life Cycle Methods 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.getCitiesList() 
    self.configureResultsSearchController() 
} 

override func viewDidDisappear(animated: Bool) { 
    super.viewDidDisappear(animated) 
    self.resultSearchController.active = false 
} 

// MARK: - Configuring Search Bar Controller 

private func configureResultsSearchController() { 
    self.resultSearchController = UISearchController(searchResultsController: nil) 
    self.resultSearchController.searchResultsUpdater = self 
    self.resultSearchController.dimsBackgroundDuringPresentation = false 
    self.resultSearchController.hidesNavigationBarDuringPresentation = false 
    self.resultSearchController.searchBar.sizeToFit() 
    self.resultSearchController.searchBar.placeholder = "Klinik veya ilçe adı" 
    self.tableView.tableHeaderView = self.resultSearchController.searchBar 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if self.resultSearchController.active { return self.filteredVeterinaries.count } 
    else { return self.cities.count } 
} 

// MARK: - Table view Delegate Methods 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if (self.resultSearchController.active) { 
     self.performSegueWithIdentifier(Constants.ShowDetailViewControllerSegueIdentifier, sender: nil) 
    } else { 
     self.performSegueWithIdentifier(Constants.ShowTownsTableViewControllerSegueIdentifier, sender: nil) 
    } 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(Constants.CellIdentifier, forIndexPath: indexPath) 
    if (self.resultSearchController.active) { 
     cell.textLabel?.text = self.filteredVeterinaries[indexPath.row].name 
     cell.detailTextLabel?.text = self.filteredVeterinaries[indexPath.row].address 
     return cell 
    } else { 
     cell.textLabel?.text = self.cities[indexPath.row] 
     return cell 
    } 
} 

// MARK: - PARSE Query Methods 

private func getCitiesList() { 
    let parseQueries = ParseQueries() 
    parseQueries.downloadListData() { 
     (let parseResults) in 
     if let veterinaries = parseResults as? [Veterinary] { 
      self.veterinaries = veterinaries 
      for vet in veterinaries { 
       if let city = vet.city { 
        self.cities.append(city) 
       } 
      } 
      dispatch_async(dispatch_get_main_queue()) { 
       self.cities = HelperMethods().removeDuplicatesAndSort(array: self.cities) 
       self.tableView.reloadData() 
      } 
     } 
    } 
} 

// MARK: - UISearchController Delegate Methods 

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    self.filteredVeterinaries.removeAll(keepCapacity: false) 
    if let searchBarText = searchController.searchBar.text{ 
     let searchText = searchBarText.lowercaseString 
     // Searching with Veterinary Name and Veterinary City 
     self.filteredVeterinaries = self.veterinaries.filter({$0.name?.lowercaseString.rangeOfString(searchText) != nil}) 
     self.filteredVeterinaries += self.veterinaries.filter({$0.town?.lowercaseString.rangeOfString(searchText) != nil}) 
     tableView.reloadData() 
    } 
} 

Questa è l'immagine dello schermo nero da iOS 9 simulatore stesso dispositivo vero e proprio. enter image description here

Penso che la sua deiniting mio tableView quando tocco la barra di ricerca e non può iniziare di nuovo. È un bug o qualcosa del genere?

Come posso risolvere questo problema?

Grazie!

risposta

20

Amico, nel vostro viewDidLoad() inserto questa riga di codice:

self.definesPresentationContext = true 

Guarda come ho messo (linea 29):

click here to see

+0

Questo è il trucco che penso. Ho risolto il problema dello schermo nero grazie a te! – emresancaktar

+0

Funziona come una magia. Grazie. Cosa significa questa proprietà? – fnc12

+0

Genius :) Funziona davvero. Grazie – Albert

0

recente ho affrontato lo stesso problema e ho potuto risolvere il problema facilmente. self.definesPresentationContext = true era già definito in viewDidLoad() ma non ha risolto questo problema.

Nella domanda precedente, è possibile visualizzare direttamente CitiesTableViewController quando si tocca elemento TabView MostViewed.

Per evitare la schermata nera, è possibile incorporare CitiesTableViewController in un UINavigationController e provare a mostrare il controller di navigazione quando si tocca la voce della scheda.

Questa soluzione eviterà il problema dello schermo nero.

Problemi correlati