2017-03-25 1 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, 여전히 순서에 영향을 미치는 등 빈의 많은 이상한 효과가 발생한다는 것입니다! 숨겨진 셀을위한 콜렉션 뷰 셀 위에있는 공간.

가 얻을 수있는 기능입니다 데이터 :

var tasks : [Task] = [] 

을이 내있는 viewDidLoad 및 viewWillAppear입니다 :

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. 

} 

이 작업 배열이 선언되고

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() 
} 

I 'let task = tasks [indexPath.r]'예외를 제외하고 함수의 모든 것에 대해 if 문을 사용해 보았습니다. 아야] ',하지만 그 반환의 모든 목적을 삭제 것이 if 진술 밖이 필요합니다 오류가 발생했습니다. idVar == task.pid 인 경우 어떻게 셀을 선택적으로 표시 할 수 있습니까? 그렇다면 표시되지 않습니다.

+0

귀하의 앱이 시도하는 것을 정말로 이해하지 못하지만 데이터 소스를 필터링하여 'cellForItamAtIndexPath :'에 도달하지 않으려합니다. 그렇게하면 표시 할 셀만 묻습니다. –

+0

@RoboticCat 앱의 아이디어는 컬렉션보기가 포함 된 하나의보기 컨트롤러가 있고 그 중 하나를 클릭하면 다음 뷰 컨트롤러 (위에서 언급 한 것)로 이동하는 프로젝트 (작업 포함)가 있다는 것입니다. 질문) 여기에 작업이 있으며 작업을 생성 할 수 있지만이 작업은 현재있는 프로젝트 아래에 저장되며 다른 작업에서는 표시되지 않습니다. 내가 달성하고자하는 것은 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 )'형식의 인수 목록으로 '가져 오기'를 호출 할 수 없다는 오류가 발생합니다."왜 오류가 발생하는지 알 수 있습니까? 도와 주셔서 감사합니다. – Richard

+0

죄송합니다. 코드를 업데이트했습니다. –

+0

불편을 끼쳐 드려 죄송합니다. "유형 값 'Task'에 '술어'구성원이 없습니다. '및'Task '유형의 값을 예상 인수 유형'NSFetchRequest '로 변환 할 수 없습니다. ". 아마 내가 술어를 초기화 할 필요가 있을까요? 귀찮게해서 죄송 합니다만, 문제를 해결하는 방법을 알고 계십니까? – Richard