2015-09-22 11 views
16

Ich habe ein Problem mit meinem ViewController.Klasse hat keine Initialisierer: Swift Error

Mein Code hat einen Fehler über Initialisierer und ich kann nicht verstehen warum.

Bitte nehmen Sie sich einen Moment Zeit an meinem Code zu suchen:

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 
    } 

} 

Was ist das Problem? Der Fehler ist, dass die Klasse keinen Initialisierer hat. Ich habe keine Variablen ohne Wert.

+0

Was ist die genaue Fehlermeldung? – KornMuffin

Antwort

33

Problematische Linie ist

var searchController: UISearchController 

ändern es zu

var searchController: UISearchController! 

oder wenn Sie es nicht im Hinblick auf Lebenszyklen der Initialisierung verwenden optional Abstürze zu vermeiden:

var searchController: UISearchController? 
+0

danke Sahil. – iGermanos

+4

vielleicht wäre es besser zu sein "var searchController: UISearchController?" stattdessen, wenn es Null ist, wird die Anwendung nicht abstürzen. plus es wird den Standardinitialisierer von null – Korpel

+0

bekommen Ja, fügte hinzu, dass zu antworten. Vielen Dank :) –

2

Ihre Linie, die den Fehler abfangen ist:

var searchController: UISearchController

weil Sie init nie searchController in einer LifeCycle init Funktion von Ihrem UIViewController. Ich rate Ihnen nicht unwrap die var zu zwingen (wie Sahil oben gesagt), aber um es richtig init in eine init func wie folgt aus:

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, sollten Sie immer Kraft unwrap Objekt wie oben zu vermeiden, zu Absturz in Ihrer App zu vermeiden, oder verwenden Sie wenn-Lassen/Guard-Lassen Sie Vorlage

Prost aus Frankreich

Verwandte Themen