>

UICollectionView의 데이터 소스를 전환하는 데 사용하는 UISegmentControl이 있습니다. 데이터 소스는 다른 유형의 객체입니다.

예를 들어 객체는 다음과 같습니다.

struct Student {
    let name: String
    let year: String
    ...
}
struct Teacher {
    let name: String
    let department: String
    ...
}

CollectionView가 포함 된보기에는 다음과 같은 코드가 있습니다.

var students = [Student]()
var teachers = [Teachers]()
... // populate these with data via an API
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if(segmentControl.titleForSegment(at: segmentControl.selectedSegmentIndex) == "Students") {
        return students?.count ?? 0
    } else {
        return teachers?.count ?? 0
    } 
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "personCell", for: indexPath) as! PersonCell
    if(segmentControl.titleForSegment(at: segmentControl.selectedSegmentIndex)! == "Students") {
        cell.title = students[indexPath.row].name
        cell.subtitle = students[indexPath.row].year
    } else {
        cell.title = teachers[indexPath.row].name
        cell.subtitle = teachers[indexPath.row].subject
    }
    return cell
}
@IBAction func segmentChanged(_ sender: AnyObject) {
    collectionView.reloadData()
}

이것은 두 데이터 소스 사이를 올바르게 전환하지만 변경 사항에 애니메이션을 적용하지는 않습니다. 나는 이것을 시도했다 :

self.collectionView.performBatchUpdates({
    let indexSet = IndexSet(integersIn: 0...0)
    self.collectionView.reloadSections(indexSet)
}, completion: nil)

그러나 이것은 단지 충돌합니다 (이것은 performBatchUpdates가 무엇을 제거하고 무엇을 추가해야하는지 혼동하기 때문이라고 생각합니다.

collectionView에 현재 항목을 저장하는 별도의 배열을 사용하지 않고이 작업을 수행하는 쉬운 방법이 있습니까? 아니면이 작업을 원활하게 수행 할 수있는 유일한 방법입니까?

미리 감사합니다!

  • 답변 # 1

    셀의 UI가 다른 데이터 소스와 동일하게 보이는 경우 다음과 같이 데이터 소스에 대해 ViewModel을 추상화 할 수 있습니다.

    struct CellViewModel {
        let title: String
        let subTitle: String
        ...
    }
    
    

    그러면 API에서 데이터를 가져올 때마다 ViewModel을 동적으로 생성

       var students = [Student]()
        var teachers = [Teachers]()
        ... // populate these with data via an API
        var viewModel = [CellViewModel]()
        ... // populate it from data above by checking currently selected segmentBarItem
        if(segmentControl.titleForSegment(at: segmentControl.selectedSegmentIndex)! == "Students") {
            viewModel = generateViewModelFrom(students)
        } else {
            viewModel = generateViewModelFrom(teachers)
        }
    
    

    따라서 항상 UICollectionView를 사용하여 하나의 데이터 소스 배열을 유지하십시오.

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return viewModel?.count ?? 0
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "personCell", for: indexPath) as! PersonCell
        cell.title = viewModel[indexPath.row].title
        cell.subtitle = viewModel[indexPath.row].subTitle
        return cell
    }
    @IBAction func segmentChanged(_ sender: AnyObject) {
        collectionView.reloadData()
    }
    
    

    그런 다음 performBatchUpdates를 사용해보십시오 :

    self.collectionView.performBatchUpdates({
        let indexSet = IndexSet(integersIn: 0...0)
        self.collectionView.reloadSections(indexSet)
    }, completion: nil)
    
    

  • 이전 html - FireFox Quantum의 개요가 자식 div에 의해 확장됩니다
  • 다음 MATLAB에서 함수 배열을 만드는 방법은 무엇입니까?