Ios 多视图控制器中的域快速过滤器

Ios 多视图控制器中的域快速过滤器,ios,swift,uicollectionview,realm,nspredicate,Ios,Swift,Uicollectionview,Realm,Nspredicate,我有10个独立的ViewController,每个都需要有自己独特的过滤数据集。每个控制器的对象及其属性都相同,但集合视图中显示的内容取决于用户在该特定控制器中发布的内容。简言之,每个星球都需要自己的数据。我需要10个不同的型号吗?或者我可以通过按行星名称进行领域排序和使用NSPredicate进行过滤来实现这一点吗?我下面的代码在加载视图时崩溃 class Planet: Object { dynamic var name = "" dynamic var council = ""

我有10个独立的ViewController,每个都需要有自己独特的过滤数据集。每个控制器的对象及其属性都相同,但集合视图中显示的内容取决于用户在该特定控制器中发布的内容。简言之,每个星球都需要自己的数据。我需要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
    }
  }
class行星:对象{
动态变量名称=“”
动态var council=“”
动态var capitol=“”
动态变量isAlive=false
动态变量到达=日期()
}
类firstVC:UIViewController、UICollectionViewDataSource、UICollectionViewDelegate{
让realm=try!realm()
结果!
让行星=行星()
覆盖有趣的viewDidLoad{
super.viewDidLoad()
行星=领域。对象(行星。自我)。排序(按键路径:“名称”,升序:false)
planets=realm.objects(Planet.self).filter(“name==firstPlanet”,“”)
}
//委托方法
func numberOfSections(在collectionView:UICollectionView中)->Int{
返回1
}
func collectionView(collectionView:UICollectionView,numberOfItemsInSection:Int)->Int{
返回。计数
}
func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UICollectionViewCell{
让cell=collectionView.dequeueReuseAbleCell(带reuseIdentifier:reuseIdentifier,for:indexPath)作为!FirstVC
cell.awakeFromNib()
返回单元
}
}

我有一个自定义的单元格类
PlanetCell
,用于存储视图,因此,
cell.awakeFromNib
您不需要10个单独的模型。。。您只需要创建10个
plant
类的对象。

但是碰撞问题我们需要更多的信息,你能显示碰撞信息吗

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

此外,您的NSPredicate语法似乎有误,假设firstPlanet是行星的实际名称而不是变量名,它应该是这样的:
plants=realm.objects(planet.self.filter(“name='firstPlanet')
。如果它是一个变量名,它应该是这样的:
planets=realm.objects(Planet.self).filter(“name=%@”,firstPlanet)


你也可以级联排序和过滤,你不需要在两行中分别完成,比如:
plants=realm.objects(Planet.self)。filter(“name=='firstPlanet'))。sorted(byKeyPath:“name”,升序:false)

你能给我们一个崩溃消息吗?嗨,Kira,通过“植物的10个对象(行星类?)”类“,你是指我的
行星:对象
类中的10个行星属性吗?例如
dynamic var planettone
dynamic var planetTwo
,等等?@David Hey man,感谢您的级联排序和筛选。很抱歉,第一次使用NSPredicate时,您不能这样做。干净多了!我假设行星的实际名称而不是变量名称也指我的
planet:Object
类的属性,例如
dynamic var planetOne=“”
,等等。隐式展开可选是因为当应用程序加载新域时,我有用属性填充单元格的起始数据(按钮、图像视图和标签)但没有数据或当前日期。这不会使应用程序崩溃。我可以在启动后删除此初始空单元格和所述属性。只有在筛选具体应填充哪个星球及其数据时才会发生线程异常。忽略最后一条注释:AppDelegate中的起始数据加载
FirstPlane中的按钮、标签等tViewController
我可以将新数据发布到
第一平面tViewController
的视图中。但是
第二平面tViewController
显示为空白!我就是这样做的:
让第二个行星=“第二个行星”
视图加载()
中我有
行星=领域对象(Planet.self).过滤器(“name=%@”,secondPlanet)。排序(按关键字路径:“capitol”,升序:false)
。然后
func collectionView(\uCollectionView:UICollectionView,numberOfItemsInSection:Int)->Int{return planets.filter(“name==%@”,secondPlanet)。count}
帮助。