2015-09-22 20 views
16

Ho un problema con il mio ViewController.La classe non ha inizializzatori: Swift Errore

Il mio codice ha un errore sugli inizializzatori e non riesco a capire perché.

Prego, prendere un momento per guardare il mio codice:

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 
    } 

} 

Qual è il problema? L'errore è che la classe non ha inizializzatore. Non ho variabili senza valore.

+0

Qual è l'esatto messaggio di errore? – KornMuffin

risposta

33

linea problematico è

var searchController: UISearchController 

Change a

var searchController: UISearchController! 

o se non si è inizializzandolo in cicli vista di vita, utilizzare opzionale per evitare le collisioni:

var searchController: UISearchController? 
+0

grazie Sahil. – iGermanos

+4

forse sarebbe meglio essere "var searchController: UISearchController?" invece se è nullo non si bloccherà l'applicazione. inoltre otterrà l'inizializzatore predefinito di nil – Korpel

+0

Sì, l'ha aggiunto per rispondere. Grazie :) –

2

tuo la linea che rileva l'errore è:

var searchController: UISearchController

perché non hai mai init searchController in una funzione init LifeCycle dal UIViewController. Vi consiglio non forzare unwrap var (come Sahil detto sopra), ma a init correttamente in un func init come questo:

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 
} 

In Swift, è sempre consigliabile evitare vigore Separa oggetto come sopra, a evitare crash nella tua app, o utilizzare if-Let/Guard-Let modello

Cheers from France

Problemi correlati