【问题标题】:Swift prepareForSegue object is nilSwift prepareForSegue 对象为零
【发布时间】:2017-03-14 02:41:33
【问题描述】:

我试图将事件对象传递给 DetailViewController,但它崩溃并说:“致命错误:在展开可选值时意外发现 nil”。我很肯定错误出现在我的准备(用于 segue :) 函数中,但我已经在这几个小时了,我不知道如何解决它。任何帮助,将不胜感激。谢谢!

这是我的代码:

class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var textView: UITextView!
@IBOutlet weak var tableView: UITableView!

var events = [Event]()

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.


    tableView.delegate = self
    tableView.dataSource = self

    parseCSV()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func logOutAction(sender: AnyObject) {
    if FIRAuth.auth()?.currentUser != nil {
        do {
            try FIRAuth.auth()?.signOut()
            let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
            present(vc, animated: true, completion: nil)

        } catch let error as NSError {
            print(error.localizedDescription)
        }
    }
}

func parseCSV() {
    let path = Bundle.main.path(forResource: "eventData", ofType: "csv")
    do {
        let csv = try CSV(contentsOfURL: path!)
        let rows = csv.rows

        for row in rows {
            let eventTitle = row["Title "]!
            let eventLoc = row[" Location "]!
            let eventStart = row[" Start_Time "]!
            let eventEnd = row [" End_Time"]!

            let event = Event(title: eventTitle, loc: eventLoc, start: eventStart, end: eventEnd)
            events.append(event)
        }
    } catch let err as NSError {
        print(err.debugDescription)
    }
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "eventCell", for: indexPath) as? EventCell{
        let event = events[indexPath.row]
        cell.updateUI(event: event)

        return cell
    } else {
        return UITableViewCell()
    }
}

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

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let event = events[indexPath.row]
    performSegue(withIdentifier: "detailSegue", sender: event)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "detailSeque" {
        if let detailVC = segue.destination as? DetailViewController {
            if let event = sender as? Event {
                detailVC.event = event
            }
        }
    }
}
}

我的 DetailViewController 类:

class DetailViewController: UIViewController {

var event: Event!

@IBOutlet weak var eventTitle: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    eventTitle.text = event.title // error here. says event is nil.
    }
}

【问题讨论】:

  • 你的 segue 是如何连接到故事板的?是来自表格单元格还是来自主视图控制器?
  • @dan 它来自我的 MainViewController 中的表格单元格。

标签: ios swift object null


【解决方案1】:

由于 segue 是从您的单元格连接的,因此在您点击单元格时它已经自动执行。以编程方式执行它会导致您的 segue 被执行两次:一次正确传递了值,一次没有。

您可以更改您的 segue 以从视图控制器而不是单元格连接,在这种情况下您的当前代码将起作用,或者更新您的代码以执行 prepareForSegue 中的所有逻辑并删除您对 @987654322 的实现@:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "detailSeque" {
        if let detailVC = segue.destination as? DetailViewController {
           let row = tableView.indexPathForSelectedRow!.row
           detailVC.event = events[row]
        }
    }
}

【讨论】:

  • 您的标识符是否正确?您在原始代码中有两种不同的拼写方式。
  • 哇。有用。真的是错字.... :) 非常感谢!!当我盯着它看太久时,很难抓住它。 XD
猜你喜欢
  • 1970-01-01
  • 2015-09-18
  • 2023-04-04
  • 1970-01-01
  • 2023-04-04
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多