【问题标题】:Realm Swift Filter in Multiple ViewControllers多个 ViewController 中的 Realm Swift 过滤器
【发布时间】:2017-05-22 04:46:23
【问题描述】:

我有 10 个独立的视图控制器,每个视图控制器都需要有自己独特的过滤数据集。每个控制器的对象及其属性都是相同的,但集合视图中显示的内容取决于用户在该特定控制器中发布的内容。简单地说,每个星球都需要有自己的数据。我需要 10 个不同的模型吗?或者我可以通过按行星名称排序的领域和使用 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

【问题讨论】:

  • 你能给我们崩溃信息吗?

标签: ios swift uicollectionview realm nspredicate


【解决方案1】:

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

【讨论】:

  • 嗨,Kira,“植物的 10 个对象(行星类?)类”是指我的 Planet: Object 类中的 10 个行星属性吗?比如dynamic var planetOnedynamic var planetTwo等?
  • @David 嘿伙计,感谢您的级联排序和过滤。抱歉,第一次与NSPredicate 合作,你能做到吗?干净多了!我假设 行星的实际名称而不是变量名称,您还意味着我的 Planet: Object 类的属性,例如dynamic var planetOne = ""
  • 隐式展开的可选选项是因为当应用程序加载一个新领域时,我有起始数据,它用属性(按钮、图像视图和标签)填充单元格,但没有数据或当前日期。这不会使应用程序崩溃。我可以在启动后删除这个初始的空单元格和所说的属性。线程异常仅在具体过滤我应该填充的行星及其数据时发生。
  • 忽略最后一条评论:AppDelegate 中的起始数据加载了FirstPlanetViewController 中的按钮、标签等,我可以将新数据发布到FirstPlanetViewController 的视图中。但是SecondPlanetViewController 出现空白!这就是我的做法:let secondPlanet = "secondPlanet"viewDidLoad() 我有planets = realm.objects(Planet.self).filter("name == %@", secondPlanet).sorted(byKeyPath: "capitol", ascending: false)
  • 然后func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&gt; Int { return planets.filter("name == %@", secondPlanet).count } 帮助。
【解决方案2】:

问题在于行星的定义和您的过滤。为什么要将行星定义为隐式展开可选,除非您 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)

【讨论】:

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