【问题标题】:Passing Core Data object from tableViewController to TabBarController将核心数据对象从 tableViewController 传递到 TabBarController
【发布时间】:2017-07-20 17:22:15
【问题描述】:

我正在尝试将核心数据对象从 tableViewController 中的列表传递给 TabBarController 以在 childViews 中解析它,我对子类 TabBarController 执行 segue

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let objs = controller.fetchedObjects , objs.count > 0 {
        let casE = objs[indexPath.row]
        performSegue(withIdentifier: "showDetail", sender: casE)
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        if let destination = segue.destination as? CaseDetail {
            if let casE = sender as? Case {
                destination.casE = casE
            }
        }
    }
}

所以把它传递给 tabBarController

class CaseDetail: UITabBarController {

    var casE: Case?
}

并试图在子视图 viewDidLoad 中获取它

override func viewDidLoad() {
    super.viewDidLoad()

    let tbvc = self.tabBarController as! CaseDetail
    casE = tbvc.casE
    print(casE as Any)
}

但我还是 nil,有人知道其他传递数据的方法吗?

感谢您的任何建议和帮助!

【问题讨论】:

  • destination.casE = casE 之前打印destination 的值,在casE = tbvc.casE 之前打印tbvc 的值。地址是一样的吗?如果是这样,哪个先打印?
  • 地址不一样,先是“destination”,然后是“tbvc”,但这是什么意思呢?目的地 tbvc 并收到这样的警告警告:尝试在 上呈现 ,其视图不在窗口层次结构中!
  • 在 prepare(for segue: UIStoryboardSegue, sender: Any?) 添加一个打印语句,例如。 print("a") 并在 viewDidLoad() 添加另一个打印语句,例如。打印(“b”)。查看序列是 a -> b 还是 b -> a

标签: ios swift uitabbarcontroller


【解决方案1】:

好吧,在阅读了 Apple 文档后,我发现了一个不错的注释

每当您在应用程序中传递 NSManagedObject 引用时,将它们声明为弱引用是有益的。这有助于在 NSManagedObject 被删除并留下对不存在对象的悬空引用的情况下保护您的视图控制器。当属性被声明为weak时,它会在对象被删除时自动设置为nil。

所以这说明了一点,我更改了 TabBarController 子类:

class CaseDetail: UITabBarController {

      weak var casE: Case? 
}

现在它完美运行了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2020-10-09
    • 2011-08-30
    相关资源
    最近更新 更多