Ios 类没有初始值设定项:Swift错误
我的ViewController有问题 我的代码有一个初始化错误,我不明白为什么 请花点时间看看我的代码:Ios 类没有初始值设定项:Swift错误,ios,swift,viewcontroller,Ios,Swift,Viewcontroller,我的ViewController有问题 我的代码有一个初始化错误,我不明白为什么 请花点时间看看我的代码: import UIKit class ViewController: UIViewController, UITableViewDataSource { let sectionsTableIdentifier = "SectionsTableIdentifier" var names: [String: [String]]! var keys: [String]! @IBOutle
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
}
}
有什么问题?
错误是该类没有初始值设定项。我没有没有没有值的变量。有问题的行是
var searchController: UISearchController
换成
var searchController: UISearchController!
或者,如果您没有在视图生命周期中对其进行初始化,请使用可选选项以避免崩溃:
var searchController: UISearchController?
捕获错误的行是:
var searchController:UISearchController
因为您从未从UIViewController在生命周期初始化函数中初始化searchController。我建议您不要强制展开var(如上面Sahil所说),而是正确地将其初始化为如下所示的init func:
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
}
在Swift中,您应该始终避免像上面那样强制展开对象,以避免应用程序崩溃,或者使用if-Let/Guard-Let模板
来自法国的欢呼声确切的错误消息是什么?也许最好是“var searchController:UISearchController?”这样,如果它为零,应用程序就不会崩溃。另外,它将得到默认的初始化器nilyahe,并将其添加到了答案中。谢谢:)