【问题标题】:Realm Swift Filter Multiple ViewControllersRealm Swift 过滤多个 ViewController
【发布时间】:2017-05-23 07:10:14
【问题描述】:

在这里重新提出问题,对代码进行一些修改:

我有一个名为 Galaxies 的类,每个类都有一个行星列表

class Galaxy: Object {
  let planets = List<Planet>()
}

class Planet: Object {
  dynamic var capitol = String()
  dynamic var council = String()
  dynamic var collective = String()
  dynamic var signals = String()
}

我有 10 个视图控制器,每个视图控制器代表一个星系,其中包含该星系特有的各种行星。如何过滤特定星系的特定行星?

当我使用隐式解包的可选项实例化 Results&lt;Galaxy&gt;! 实例时,它会在第一个 Galaxy VC 中编译,因为我的 AppDelegate 中有起始数据。当我在第二个 Galaxy VC 中执行 let galaxy = Results&lt;Galaxy&gt;? = nil 时,集合视图变为空白。

这是有道理的,因为没有数据。

所以,我想我有两个问题:如何实例化 Results 对象并为每个没有初始数据的视图控制器进行过滤?

我试过galaxies = realm.objects(Galaxy.self).filter("planets == %@", firstPlanet).sorted(byKeyPath: "capitol", ascending: false)in viewDidLoad() 但这会崩溃:

libc++abi.dylib: terminating with uncaught exception of type NSException

最后,var galaxy = Results&lt;Galaxy&gt;() 引发异常cannot invoke initializer for type Results with no arguments

【问题讨论】:

  • 再问什么问题?如果您已经向 Stack Overflow 发布了一个问题,最好根据需要对该问题进行编辑,而不是创建一个完整的其他帖子。或者,如果引用不同但相关的帖子,链接到它也会有所帮助。

标签: ios swift uicollectionview realm filtering


【解决方案1】:

为你的视图控制器 A 从选定的 Galaxy 传递行星,准备 segue 方法

var galaxies:[Galaxy] = realm.objects(Galaxy.self)
var selectedGalaxyIndex = 0
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "segue_for_ViewController_B") {
        // pass data to next view
        let vc = segue.destination as viewControllerB
        vc.planets = galaxies[selectedGalaxyIndex].planets
    }
}

在你的视图控制器 B 中添加

var planets:[Planet]?

【讨论】:

    【解决方案2】:

    如果没有初始数据,Realm 查询将为空,这似乎是您想要的。例如:

    class Galaxy: Object {
      let planets = List<Planet>()
    }
    
    class Planet: Object {
      dynamic var capitol = String()
      dynamic var council = String()
      dynamic var collective = String()
      dynamic var signals = String()
    }
    
    let realm = try! Realm()
    
    let galaxies = realm.objects(Galaxy.self)
    print(galaxies.count) // => 0
    

    至于您看到的NSException,我建议您阅读打印到控制台或日志的整条消息,因为这应该会告诉您您做错了什么。从您的代码片段来看,firstPlanet 可能为 nil,这意味着 planets == nil 是非法查询,因为 List 属性永远不能为 nil。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2016-06-26
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多