准备segue导致"发现nil,同时解开一个可选值"

时间:2017-03-26 18:50:25

标签: ios swift segue

我试图从具有一个值"楼层号"的表格视图单元格执行segue。到另一个用于分配每层楼房间数量的vc。我在整个函数中都有断点来验证传递的值是否为零。关键是它不是零,它的值是#34;楼层数"。当我尝试将该值分配给下一个VC中的变量时,我得到unwrapping可选的nil错误。有人可以帮我解决这个问题吗,因为我不知道这是从哪里来的,调试器告诉我,我想要传递的变量中有一个值。代码清单如下。谢谢你:

class AssignNumberOfRoomsForFloorsVC: UITableViewController {

//MARK: - Properties

private var managedObjectContext: NSManagedObjectContext!

private var storedFloors = [Floors]()


//MARK: - Actions

override func viewDidLoad() {
    super.viewDidLoad()
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    loadFloorData()
    self.tableView.reloadData()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

private func loadFloorData() {
    let request: NSFetchRequest<Floors> = Floors.fetchRequest()
    request.returnsObjectsAsFaults = false
    do {
        storedFloors = try managedObjectContext.fetch(request)
    }
    catch {
        print("could not load data from core \(error.localizedDescription)")
    }
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "floor cell", for: indexPath) as! FloorCell
    let floorItem = storedFloors[indexPath.row]
    cell.floorNumberTxt.text = String(floorItem.floorNumber)
    return cell
}

// MARK: - Navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    var selectedRow = self.tableView.indexPathForSelectedRow
    let floorItem = storedFloors[(selectedRow?.row)!]
    let destinationController = segue.destination
    if let assignRoomsVC = destinationController as? DeclareRoomsVC {
        if let identifier = segue.identifier {
            switch identifier {
            case "assign number of rooms":
                assignRoomsVC.floorNumberTxt.text = String(floorItem.floorNumber) // ERROR HAPPENS ON THIS LINE
                assignRoomsVC.selectedFloor = floorItem.floorNumber

            default: break
            }
        }
    }
}

}

1 个答案:

答案 0 :(得分:2)

在准备segue方法时,视图尚未加载,因此您的故事板尚未创建任何视图。

看起来floorNumberTxt可能是文本字段或标签。您正在尝试分配此视图的属性,但该视图尚不存在。因此,“在展开可选值时找到nil”错误消息。

在分配任何视图控制器的视图属性之前,尝试添加let _ = assignRoomsVC.view。通过访问视图(assignRoomsVC.view),您将强制加载视图并实例化其所有子视图。