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