2017-03-25 11 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() 
} 

私は'let task = tasks [indexPath.r]の例外を除いて、関数内のすべてのものについてif文を使ってみました。私はエラーが発生しました。なぜなら、if文の外側にある必要があるため、その目的が全体的に削除されるからです。 idVar == task.pidの場合はどのようにセルを選択的に表示できますか?そうでない場合は表示されません。

+0

あなたのアプリが何をしようとしているのか分かりませんが、データソースをフィルタリングしても 'cellForItamAtIndexPath:'に到達しないようにしようとします。そうすれば、表示したいセルだけを尋ねられます。 –

+0

@RoboticCatこのアプリのアイデアは、コレクションビューを含むビューコントローラが1つあり、その中にプロジェクト(タスクを含む)が1つあれば、次のビューコントローラに移動します質問)、ここではタスクがあり、タスクを作成できますが、これらのタスクは現在のプロジェクトの下に保存され、他のタスクには表示されません。私が達成しようとしているのは、idVar == pidを持たないセルを表示しないことです。しかし、私が得たのはそれらを隠すことですが、それらのセルが空白になった場所は空になります。ありがとうございました – Richard

+0

その場合、私が提案したものを実行し、特定のプロジェクトのタスクのみを含む(または返す)ようにデータソースをフィルタリングする必要があります。 'コレクションビュー(_:アイテムのためのセル):'これは実行するには遅すぎるので、 'コレクションビュー(_:アイテム数セクション:) '(または、配列が正しい項目のみを含むようにする) –

答えて

0

述語プロパティが設定されていないため、フェッチ要求Task.fetchRequest()がすべてのタスクをフェッチしています。代わりに、フェッチに述語を添付して、必要なオブジェクトのみを取得します。

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

また、sortDescriptorsプロパティを使用して並べ替え順序を設定することもできます。

+0

私はそれを 'do {}'に入れますが、 ''(NSFetchRequest ) 'の引数リストで' fetch 'を呼び出せません "というエラーが表示されます。助けてくれてありがとう。 – Richard

+0

申し訳ありませんが、コードを更新しました。 –

+0

私は新しいコードを入力し、2つのエラーが発生しました。 "タイプの値 'タスクにメンバー'述語 'がありません"と "タイプ'タスクの値を期待される引数タイプ 'NSFetchRequest 'に変換できません。 "おそらく私は述語を初期化する必要がありますか?申し訳ありませんが、それを修正する方法は分かりますか? – Richard

関連する問題