Swift 准备(对于segue:)不在域中传递数据

Swift 准备(对于segue:)不在域中传递数据,swift,realm,realm-mobile-platform,real-mode,Swift,Realm,Realm Mobile Platform,Real Mode,prepare(for segue:)函数运行,但数据不会发送到我的目标ViewController。加载必须接收数据的VC集合视图时,我遇到以下错误: 在展开可选值时意外发现nil 我已经确认segue类型是一个选择segue,segue标识符是正确的,并且视图可以显示虚拟数据 第一视图控制器(DROURVC): let realm=试试看!领域() var allDrawers:结果? 重写func tableView(tableView:UITableView,didSelectRowAt

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

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

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

第一视图控制器(DROURVC):

let realm=试试看!领域()
var allDrawers:结果?
重写func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
打印(“Gotool segue”)
性能检查(带有标识符:“GoTool”,发送者:self)
}
覆盖功能准备(对于segue:UIStoryboardSegue,发送方:有吗?){
如果segue.identifier==“gotool”{
打印(“准备从抽屉中继续运行”)//此操作将运行!
让destinationVC=segue.destination为!ToolVC
如果让indexPath=tableView.indexPathForSelectedRow{
destinationVC.selectedDrawer=allDrawers?[indexPath.row]
打印(“所选抽屉设置为索引路径”)//未运行:(
}
}如果segue.identifier==“goToEditCategory”,则为else{
_=segue.destination as!EditCategoryVC
}
}
目标视图控制器(ToolVC):

let realm=try!realm()
var allTools:结果?
var selectedDrawer:抽屉{
迪塞特{
//未运行,因为从未设置selectedDrawer:(
打印(“所选抽屉从\(旧值)更改为\(selectedDrawer?.title)”)
加载工具()
}
}
func loadTools(){
allTools=selectedDrawer?.tools.sorted(按键路径:“标题”,升序:false)
toolCollectionView.reloadData()//这是我得到可选值错误的地方
}

您犯了一个非常常见的错误

在目标视图控制器中,您正在访问
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
方法。

您如何从故事板连接segue?这是一个“显示”segue。我的意思是它与ViewController?或ViewController中的任何其他组件连接。segue从第一个视图控制器的表视图原型单元连接到目标VC。这就是问题的原因。您需要将segue与ViewController连接。
var selectedDrawer: Drawer?
func viewDidLoad() {
    super.viewDidLoad()
    if let drawer = selectedDrawer {
        allTools = drawer.tools.sorted(byKeyPath: "title", ascending: false)
        toolCollectionView.reloadData()
    }
}