我正在尝试创建一个集合视图列表,它使用CoreData。它显示任务,任务是CoreData实体,它具有名称等属性。
我想要它做的是,如果属性(在这种情况下' pid')等于某个值,则返回集合视图单元格,如果没有,则不要返回细胞。这就是我的cellForItemAt的样子:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let task = tasks[indexPath.row]
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "connectCell", for: indexPath) as! MyCollectionViewCell
if idVar == task.pid {
cell.labelTe?.text = task.name
} else {
print("blank cell?")
}
if cell.labelTe.text == "" {
print("cell is nil")
cell.isHidden = true
}
self.myCollView.backgroundColor = UIColor.clear
cell.layer.cornerRadius = 25
//Swipe gesture register
let cSelector = #selector(reset(sender:))
let leftSwipe = UISwipeGestureRecognizer(target: self, action: cSelector )
leftSwipe.direction = UISwipeGestureRecognizerDirection.left
cell.addGestureRecognizer(leftSwipe)
return cell
}
这个解决方案的问题是虽然如果idVar!= task.pid隐藏了单元格,但它仍会影响排序并导致奇怪的效果,例如集合视图单元格上方的大量空白区域,隐藏单元格的意思是是。
这是获取数据的功能:
func getData() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
tasks = try context.fetch(Task.fetchRequest())
}
catch {
print("Get Data failed")
}
// Fetches data.
}
这是声明的Task数组:
var tasks : [Task] = []
这是我的viewDidLoad和viewWillAppear:
override func viewDidLoad() {
super.viewDidLoad()
self.myCollView.delegate = self
self.myCollView.dataSource = self
print("In next view")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
getData()
myCollView.reloadData()
}
我尝试在函数中的所有内容上使用if语句,除了' let task = tasks [indexPath.row]',但是我收到了一个错误,因为返回需要在如果声明会删除它的整个目的。如果idVar == task.pid,如何选择性地显示单元格,如果没有,那么它根本不显示?
答案 0 :(得分:0)
获取请求Task.fetchRequest()
正在获取所有任务,因为未设置谓词属性。而是将谓词附加到fetch,以便只获取所需的对象。
let fetchRequest = Task.fetchRequest();
fetchRequest.predicate = NSPredicate.init(format: "pid = %@", idVar);
tasks = try context.fetch(fetchRequest)
您可能还想使用sortDescriptors属性设置排序顺序。