打开UIViewController时,在打开Optional值时意外发现nil

时间:2015-06-29 19:55:12

标签: ios swift uitableview

我正在使用swift做一个简单的tableview应用程序,在点击表格行后以编程方式打开一个新的视图控制器:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

//GLobals
@IBOutlet weak var table: UITableView!
//Table View Data

let cats :[String] = ["Gala","Vito","Odin","Ema"]

override func viewDidLoad() {
    super.viewDidLoad()

    table.delegate = self
    table.dataSource = self
}

// MARK:  UITextFieldDelegate Methods
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return cats.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = table.dequeueReusableCellWithIdentifier("CustomTextCell", forIndexPath: indexPath) as! UITableViewCell

    let row = indexPath.row
    cell.textLabel?.text = cats[row]

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)

    let row = indexPath.row
    let cat : String = cats[row];
    println(cat)

    //Save cat for detail view
    var defaults = NSUserDefaults.standardUserDefaults()
    defaults.setObject(cat, forKey: "cat")
    defaults.synchronize()


    let detail:Detail = Detail();
    self.presentViewController(detail, animated: true, completion: nil);
}
}

详细视图中的代码如下:

class Detail: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.whiteColor()

    let defeaults = NSUserDefaults.standardUserDefaults()

    let cat = defeaults.stringForKey("cat")

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = cat

    self.view.addSubview(label)
}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    let home:ViewController = ViewController()
    self.presentViewController(home, animated: true, completion: nil)
}

然而,当应用程序返回到ViewController时,我“在展开Optional值时意外地发现了nil “

the error

我已经尝试了一些其他问题的答案,包括用if == nil一些值翘曲,但我仍然找不到问题所在。

我假设UIViewController没有再次加载UITableViewDelegate和UITableViewDataSource,但我不明白为什么......以及如何从另一个视图加载它们?

2 个答案:

答案 0 :(得分:3)

您可以从代码中初始化touchesBegan中的ViewController,因为新分配的ViewController中的结果表为nil。在您从InterfaceBuilder初始化之前,它是通过IBOutlet设置的。因此,当您在viewDidLoad中执行代码时,由于表不可用而导致应用程序崩溃。

您可以按照以下方式更改代码,它应该可以正常工作:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
  dismissViewControllerAnimated(true, completion: nil)
}

答案 1 :(得分:1)

而不是

val.csv
你可能应该这样做

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    let home:ViewController = ViewController()
    self.presentViewController(home, animated: true, completion: nil)
}

否则,您会为override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { self.dismissViewControllerAnimated(true, completion: nil) } 创建一个未设置ViewController的新实例,因此会tableView,因此会崩溃。