2015-09-22 28 views
16

Mam problem z moim ViewController.Klasa nie ma inicjalizatorów: Swift Error

Mój kod zawiera błąd dotyczący inicjalizatorów i nie mogę zrozumieć, dlaczego.

Proszę poświęć chwilę, aby spojrzeć na mój kod:

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 
    } 

} 

czym polega problem? Błąd polega na tym, że klasa nie ma inicjalizatora. Nie mam zmiennych bez wartości.

+0

Jaki jest dokładny komunikat o błędzie? – KornMuffin

Odpowiedz

33

Problematyczne jest to

var searchController: UISearchController 

Zmień go

var searchController: UISearchController! 

lub jeśli nie są inicjowanie go w cyklach widok życiowych, należy użyć opcjonalnego aby uniknąć awarii:

var searchController: UISearchController? 
+0

dziękuję Sahil. – iGermanos

+4

może lepiej byłoby być "var searchController: UISearchController?" zamiast tego, jeśli jest zerowy, aplikacja nie ulegnie awarii. plus dostanie domyślny inicjator o wartości zerowej – Korpel

+0

Tak, dodałem to, aby odpowiedzieć. Dzięki :) –

2

Twój linia, która przechwytuje błąd, to:

var searchController: UISearchController

ponieważ nigdy init searchController w Lifecycle init z Twojego UIViewController. Radzę ci nie zmuszać rozpakować var (jak powiedział Sahil powyżej), ale do prawidłowego procesu init go do func init, jak ta:

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 
} 

w Swift, zawsze powinny unikać siły rozpakować Object jak powyżej, uniknij awarii w aplikacji lub użyj szablonu "Let/Guard-Let"

Pozdrowienia z Francji