如何选择何时返回集合查看单元格

时间:2017-03-25 15:58:38

标签: ios swift core-data uicollectionview

我正在尝试创建一个集合视图列表,它使用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,如何选择性地显示单元格,如果没有,那么它根本不显示?

1 个答案:

答案 0 :(得分:0)

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

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

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