【发布时间】:2017-08-18 12:24:14
【问题描述】:
我正在尝试创建一个集合视图列表,它使用 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.
}
这是正在声明的任务数组:
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]' 除外,但是我得到了一个错误,因为返回需要在 if 语句之外,这将删除它的全部目的。如果 idVar == task.pid 如何有选择地显示单元格,但如果没有,则根本不显示?
【问题讨论】:
-
我不太了解您的应用程序试图做什么,但我会尝试通过过滤我的数据源来达到
cellForItamAtIndexPath:。这样,您只会被要求提供要显示的单元格。 -
@RoboticCat 该应用程序的想法是您有一个包含集合视图的视图控制器,并且如果您单击其中一个项目(包含任务),您将转到下一个视图控制器(问题中提到的那个),在这里您有任务并且可以创建任务,但它将这些任务保存在您所在的项目下并且不会显示在其他项目中。我想要实现的是不显示任何没有 idVar == pid 的单元格,但是我得到的最接近的是隐藏它们,但是这些单元格将占用的位置现在是空白的。感谢询问
-
在这种情况下,您需要执行我的建议并过滤您的数据源,使其仅包含(或仅返回)特定项目的那些任务。
collectionView(_:cellForItemAt:):这样做太晚了,所以需要在collectionView(_:numberOfItemsInSection:)中完成(甚至更早,以便数组只包含正确的项目)。 -
@RoboticCat 我理解你在 cellForItemAt 之前过滤它的意思,但是我不知道如何实际做到这一点。我使用 'var tasks : [Task] = []' 导入 CoreData,但我不确定如何过滤掉。我认为用 numberOfItemsInSection 做一些事情可以解决这个问题,但是我不确定任何实用的方法。感谢您的回复。
-
请分享您获取对象的代码(创建任务数组)。正如@RoboticCat 所指出的,这是需要更改的代码。
标签: ios swift core-data uicollectionview