多个ViewControllers中的Realm Swift过滤器

时间:2017-05-22 04:46:23

标签: ios swift uicollectionview realm nspredicate

我有10个独立的视图控制器,每个视图控制器都需要拥有自己独特的过滤数据集。对象及其属性对于每个控制器都是相同的,但集合视图中显示的内容基于用户在该特定控制器中发布的内容。简而言之,每个星球都需要有自己的数据。我需要10个单独的型号吗?或者我可以通过行星名称排序Realm并使用NSPredicate过滤来实现此目的吗?下面的代码在视图加载时崩溃。

class Planet: Object {
  dynamic var name = ""
  dynamic var council = ""
  dynamic var capitol = ""
  dynamic var isAlive = false
  dynamic var arrived = Date()
}

class firstVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

  let realm = try! Realm()
  var planets : Results<Planet>!
  let planet = Planet()

  override fun viewDidLoad {
    super.viewDidLoad()

  planets = realm.objects(Planet.self).sorted(byKeyPath: "name", ascending: false)

  planets = realm.objects(Planet.self).filter("name == firstPlanet", "")

  }


  // Delegate Methods

  func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
  }

  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return planets.count
  }

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! FirstVC

    cell.awakeFromNib()
    return cell
    }
  }

我有一个自定义单元格类PlanetCell,其中存储了视图,因此cell.awakeFromNib

2 个答案:

答案 0 :(得分:1)

您不需要10个单独的模型......您只需要创建10个plant类对象。
但是我们需要更多信息的崩溃问题,你能否显示崩溃消息?

答案 1 :(得分:1)

问题在于行星的定义和过滤。你为什么要将行星定义为隐式解包的可选项,除非你100%确定在填充行星时你的日期与你的NSPredicate相匹配?

此外,您的NSPredicate语法似乎是错误的,它应该看起来像假设firstPlanet是行星的实际名称而不是变量名称:planets = realm.objects(Planet.self).filter("name == 'firstPlanet'")。如果它是变量名称,它应如下所示:planets = realm.objects(Planet.self).filter("name == %@", firstPlanet)

您还可以级联排序和过滤,您不需要分两行,例如:planets = realm.objects(Planet.self).filter("name == 'firstPlanet'").sorted(byKeyPath: "name", ascending: false)