ios swift viewcontroller

ios - La clase no tiene inicializadores: Swift Error



viewcontroller (2)

La linea problemática es

var searchController: UISearchController

Cambiarlo a

var searchController: UISearchController!

o si no lo está inicializando en los ciclos de vida de la vista, use la opción para evitar bloqueos:

var searchController: UISearchController?

Tengo un problema con mi ViewController.

Mi código tiene un error sobre los inicializadores y no puedo entender por qué.

Por favor, tome un momento para mirar mi código:

import UIKit class ViewController: UIViewController, UITableViewDataSource { let sectionsTableIdentifier = "SectionsTableIdentifier" var names: [String: [String]]! var keys: [String]! @IBOutlet weak var tableView: UITableView! var searchController: UISearchController //methods override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: sectionsTableIdentifier) let path = NSBundle.mainBundle().pathForResource("sortednames", ofType: "plist") let namesDict = NSDictionary(contentsOfFile: path!) names = namesDict as! [String: [String]] keys = namesDict!.allKeys as! [String] keys = keys.sort() let resultsController = SearchResultsController() resultsController.names = names resultsController.keys = keys searchController = UISearchController(searchResultsController: resultsController) let searchBar = searchController.searchBar searchBar.scopeButtonTitles = ["All", "Short", "Long"] searchBar.placeholder = "Enter a search term" searchBar.sizeToFit() tableView.tableHeaderView = searchBar searchController.searchResultsUpdater = resultsController } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func numberOfSectionsInTableView(tableView: UITableView) -> Int { return keys.count } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let key = keys[section] let nameSection = names[key]! return nameSection.count } func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return keys[section] } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(sectionsTableIdentifier, forIndexPath: indexPath) as UITableViewCell let key = keys[indexPath.section] let nameSection = names[key]! cell.textLabel!.text = nameSection[indexPath.row] return cell } func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? { return keys } }

¿Cuál es el problema? El error es que la clase no tiene inicializador. No tengo variables sin valor.


Su línea que atrapa el error es:

var searchController: UISearchController

porque nunca inicia searchController en una función de inicio de LifeCycle desde su UIViewController. Le aconsejo que no fuerce el desenvolvimiento de la var (como dijo Sahil anteriormente), sino que lo inicie correctamente en una función de inicio como esta:

override init(frame: CGRect) { super.init(frame: frame) setUp() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setUp() } func setUp() { searchController = UISearchController() //Or any init you can use to perform some custom initialization }

En Swift, siempre debe evitar forzar el desenvolvimiento de objetos como el de arriba, para evitar que se bloquee en su aplicación, o usar la plantilla if-Let / Guard-Let

Saludos desde francia