2017-03-25 47 views
0

我想创建一个集合视图列表,它使用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.r ow]',但是我得到一个错误,因为回报需要在if语句之外,这会删除它的全部目的。如何选择性地显示单元格,如果idVar == task.pid,但如果没有,那么它根本不显示?

+0

我真的不明白你的应用程序正在尝试做什么,但我会尽量不要通过过滤我的数据源来达到'cellForItamAtIndexPath:'。这样,你只需要询问你想要显示的细胞。 –

+0

@RoboticCat应用程序的想法是,你有一个视图控制器包含一个集合视图,并在有项目(包含任务),如果你点击其中一个,你去下一个视图控制器(提到一个问题),在这里你有任务,可以创建任务,但它将这些任务保存在你所在的项目下,而不会显示在其他项目中。我试图实现的是不显示任何没有idVar == pid的单元格,但是最近我得到的是隐藏它们,但那些单元格将采取的地方现在是空白的。感谢您提出要求 – Richard

+0

在这种情况下,您需要按照我的建议进行操作,并过滤数据源,使其仅包含(或仅返回)特定项目的这些任务。 '集合视图(_:单元格对于项目:):'为时已晚,因此需要在集合视图中完成(_:项目数量Section:)'(或甚至更早,以便数组只包含正确的项目)。 –

回答

0

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

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

你可能还需要设置使用sortDescriptors属性的排序顺序。

+0

我把它放在“做{}”但我得到的错误说“无法调用‘取’与类型的参数列表‘(NSFetchRequest )’”你知道为什么它给了一个错误。谢谢您的帮助。 – Richard

+0

对不起,我更新了我的代码。 –

+0

对不起,打扰,我输入了新的代码,并得到了2个错误,而“不能类型的值‘任务’转换为预期的参数类型“型‘任务’没有成员‘谓词’价值”‘NSFetchRequest ’ ”。也许我需要初始化谓词?很抱歉打扰,但你知道如何解决它吗? – Richard

相关问题