【问题标题】:How to Choose When to Return Collection View Cell如何选择何时返回集合视图单元格
【发布时间】: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 的单元格,但是我得到的最接近的是隐藏它们,但是这些单元格将占用的位置现在是空白的。感谢询问
  • 在这种情况下,您需要执行我的建议并过滤您的数据源,使其仅包含(或仅返回)特定项目的那些任务。 collection​View(_:​cell​For​Item​At:​): 这样做太晚了,所以需要在 collection​View(_:​number​Of​Items​In​Section:​) 中完成(甚至更早,以便数组只包含正确的项目)。
  • @RoboticCat 我理解你在 cellForItemAt 之前过滤它的意思,但是我不知道如何实际做到这一点。我使用 'var tasks : [Task] = []' 导入 CoreData,但我不确定如何过滤掉。我认为用 numberOfItemsInSection 做一些事情可以解决这个问题,但是我不确定任何实用的方法。感谢您的回复。
  • 请分享您获取对象的代码(创建任务数组)。正如@RoboticCat 所指出的,这是需要更改的代码。

标签: ios swift core-data uicollectionview


【解决方案1】:

获取请求Task.fetchRequest() 正在获取所有任务,因为未设置谓词属性。而是将谓词附加到 fetch 中,这样您就只能获取所需的对象。

let fetchRequest = Task.fetchRequest();
fetchRequest.predicate = NSPredicate.init(format: "pid = %@", idVar);
tasks = try context.fetch(fetchRequest)

您可能还想使用 sortDescriptors 属性设置排序顺序。

【讨论】:

  • 我把它放在'do {}'中但是我收到错误消息“无法使用'(NSFetchRequest)'类型的参数列表调用'fetch'”你知道为什么吗给出一个错误。感谢您的帮助。
  • 很抱歉,我输入了新代码并收到 2 个错误,“'Task' 类型的值没有成员 'predicate'”和“无法将 'Task' 类型的值转换为预期参数键入“NSFetchRequest”。也许我需要初始化谓词?抱歉打扰了,你知道怎么解决吗?
  • 再次更新。抱歉,我正在处理 20 件事。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多