将对象从 Realm 数据库传输到另一个 UITabBar 控制器

Posted

技术标签:

【中文标题】将对象从 Realm 数据库传输到另一个 UITabBar 控制器【英文标题】:Transferring an object from a Realm database to another UITabBar controller 【发布时间】:2019-10-07 05:54:59 【问题描述】:

请告诉我,我正在尝试解决使用 Realm 数据库将类的实例传输到另一个控制器的问题。

我有一个主控制器,它根据模型存储对象以下数据:

class Route: Object 
    @objc dynamic var routeImage: Data?
    @objc dynamic var routeName: String?
    @objc dynamic var numberOfPersons = 0.0
    @objc dynamic var dateOfDeparture: String?
    @objc dynamic var dateOfArrival: String?
    let placeToVisit = List<Place>()
    let person = List<Person>()

在我需要将此数据传输到的控制器中,我创建了

var currentRoute: Route!

在 Storyboard 中,我指定了从控制器单元到 UITabBar 的标识符“showDetail”,在主控制器中,我创建了一个方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "showDetail" 
       guard let indexPath = tableView.indexPathForSelectedRow else return

       let newPlaceVC = segue.destination as! InformationViewController
           newPlaceVC.currentRoute = routes[indexPath.row]
    

我得到的错误:

The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Could not cast value of type 'UITabBarController' (0x111ed8b10) to 'Organizer_Tourist.InformationViewController' (0x108dd0a70).
2019-10-07 14:30:35.626853+0800 Organizer Tourist[5467:2618892] Could not cast value of type 'UITabBarController' (0x111ed8b10) to 'Organizer_Tourist.InformationViewController' (0x108dd0a70).
(lldb) 

但它是无效的,应用程序通过点击单元格崩溃。我想如果没有 tabBar 而是常规表视图控制器,这将起作用。我一直在寻找解决方案,但我遇到的只是通过单例实现。现在我有很多问题,但这真的是正确的决定吗?人们说这违反了应用程序的“模块化”并带有其自身的问题。问题是这是如何通过单例完成的?要考虑什么,从哪里开始?哪种方法值得修改?

【问题讨论】:

当您点击单元格时,错误说明了什么?请在您的问题中添加错误消息。 在 UIViewAlertForUnsatisfiableConstraints 创建一个符号断点,以便在调试器中捕获它。 中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。无法将“UITabBarController”(0x111ed8b10)类型的值转换为“Organizer_Tourist.InformationViewController”(0x108dd0a70)。 2019-10-07 14:30:35.626853+0800 Organizer Tourist [5467:2618892] 无法将“UITabBarController”(0x111ed8b10)类型的值转换为“Organizer_Tourist.InformationViewController”(0x108dd0a70)。 (lldb) 【参考方案1】:

错误说明发生了什么:

无法转换“UITabBarController”类型的值

您正在尝试将segue.destination 转换为拼写错误InformationViewController,但事实并非如此。

如果您将InformationViewController 嵌入到UITabBarController 中,则需要转换为UITabBarController 而不是InformationViewController

试试这样的:

if segue.identifier == "showDetail" 
   guard let indexPath = tableView.indexPathForSelectedRow else  return 

   let tabBarController = segue.destination as! UITabBarController
   UserSelectedRoute.shared.selectedRoute = routes[indexPath.row]

如果你想将当前选择的路由传递给InformationViewController,你可以创建单例对象来保存当前路由

final class UserSelectedRoute 

    private init()  

    static var shared = UserSelectedRoute()

    var selectedRoute: Route?

然后在你的InformationViewController 中你可以有类似的东西:

var currentRoute = UserSelectedRoute.shared.selectedRoute

希望对您有所帮助!

【讨论】:

是否意味着我需要为tabbar类创建一个新文件并为这个类指定目标?现在我有 5 个视图控制器,它们包含在 tabBar 中,但我没有描述 tabBar 的文件。我可以将 segue.destination 指定为!例如“TabBarController”? @StGregor1996 我编辑了我的答案,只需转换为UITabBarController 它应该可以正常工作 好的,但是我有新的错误=('UITabBarController'类型的值没有成员'currentRoute' 我看到一个问题,我添加了 Singleton 对象的基本示例 我遵循了您的所有建议,但在 InformationViewController =( Unexpectedly found nil ... 我尝试从数据库中获取对象并将新值附加到属性 placeToVisit() 中另一个VC。值是错字地方

以上是关于将对象从 Realm 数据库传输到另一个 UITabBar 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 UITableViewCell 传输到另一个 UIViewController?

将数据从一个列族 db 传输到另一个列族

如何将数据从一个片段传输到另一个片段android

将数据从一个组件传输到另一个角度

通过 SSIS 将数据从一个表传输到另一个表

如何将数据从一个表传输到另一个表