【问题标题】:Prepare(for segue: ) not passing data in RealmPrepare(for segue:) 不在 Realm 中传递数据
【发布时间】:2019-03-31 03:57:21
【问题描述】:

prepare(for segue: ) 函数运行,但数据没有发送到我的目标 ViewController。加载必须接收数据的 VC 集合视图时出现以下错误:

在展开可选值时意外发现 nil

我已经确认 segue 类型是 selection segue,segue 标识符是正确的,并且视图可以显示虚拟数据。

第一个视图控制器(DrawerVC):

    let realm = try! Realm()
    var allDrawers: Results<Drawer>?

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("goToTool segue")
        performSegue(withIdentifier: "goToTool", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToTool" {
            print("Prepare for segue from drawerVC ran")  // this runs!
            let destinationVC = segue.destination as! ToolVC
            if let indexPath = tableView.indexPathForSelectedRow {
                destinationVC.selectedDrawer = allDrawers?[indexPath.row]
                print("Selected drawer set to index path")  // doesn't run :(
            }
        } else if segue.identifier == "goToEditCategory" {
            _ = segue.destination as! EditCategoryVC
        }
    }

目标视图控制器(ToolVC):

    let realm = try! Realm()
    var allTools: Results<Tool>?

    var selectedDrawer: Drawer? {
        didSet{
            // doesn't run since selectedDrawer was never set :(
            print("The selected drawer changed from \(oldValue) to \(selectedDrawer?.title)")
            loadTools()
        }
    }

    func loadTools() {
        allTools = selectedDrawer?.tools.sorted(byKeyPath: "title", ascending: false)
        toolCollectionView.reloadData()  // this is where I get the optional value error
    }

【问题讨论】:

  • 你是如何从故事板连接segue的?
  • 这是一个“秀”的转场。
  • 我的意思是它与 ViewController 连接?或您的 ViewController 中的任何其他组件
  • segue 从第一个视图控制器的表格视图原型单元连接到目标 VC。
  • 这就是问题所在。您需要将 segue 与您的 ViewController 连接起来。

标签: swift realm realm-mobile-platform real-mode


【解决方案1】:

你犯了一个非常常见的错误。

在目标视图控制器中,您正在访问loadTools() 中的表视图,在您分配所选抽屉时,该表视图尚未连接。因此表视图为nil 并导致崩溃。

解决方案是删除didSet 观察者

var selectedDrawer: Drawer?

并加载viewDidLoad中的数据

func viewDidLoad() {
    super.viewDidLoad()
    if let drawer = selectedDrawer {
        allTools = drawer.tools.sorted(byKeyPath: "title", ascending: false)
        toolCollectionView.reloadData()
    }
}

如果 segue 从单元格连接到目标视图控制器,请删除 didSelectRowAt 方法。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多