2017-06-30 7 views
8

Mam UICollectlectView, który ma nagłówków sekcji, ale nie sekcji stopki. W związku z tym nie mam zdefiniowanego widoku stopki. Apple's documentation stwierdza, że ​​You must not return nil from this method.Co powrócić z kolekcjiView (_: viewForSupplementaryElementOfKind: at :), jeśli nie chcesz niczego zwracać?

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
    switch kind { 
    case UICollectionElementKindSectionHeader: 
     let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, 
                     withReuseIdentifier: "MyHeaderView", 
                     for: indexPath) as! MyHeaderView 
     switch indexPath.section 
     { 
     case 0: 
      headerView.label_title.text = "SOME HEADER" 
     case 1: 
      headerView.label_title.text = "ANOTHER HEADER" 
     default: 
      headerView.label_title.text = "UNKNOWN HEADER" 
     } 
     return headerView 
    default: 
     assert(false, "Unexpected element kind") // Not a good idea either 
    } 
    return nil // NOPE, not allowed 
} 
+2

powrót pusty UICollectionReusableView() jak to –

Odpowiedz

-1

Możesz powrócić pusty Zobacz, jak sądzę. Nie ma określonego rozmiaru.

retun UIView() 
0

Spróbuj jak poniżej

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
     var headerView = UICollectionReusableView() 
    if kind == UICollectionElementKindSectionHeader { 
     headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderViews", for: indexPath) 

    } 
    return headerView 
+2

To odpoczynku na innym jako część z was siła owijania 'headerview'. –

+1

@NiravD Dzięki. zapomniałem o tym. teraz aktualizuję moją odpowiedź. – KKRocks

-1

W metodzie viewForSupplementaryElementOfKind musi trzeba zwrócić przedmiot z UICollectionReusableView .To nie jest optional.So nie zaakceptuje zerowe.

Więc po prostu powrócić coś jak kiedy chcesz domyślnie

return UICollectionReusableView() 
-3

Spróbuj użyć

return UICollectionReusableView() 
-1

Jak widać metoda viewForSupplementaryElementOfKind zwraca UICollectionReusableView i to nie jest opcjonalnie typ więc trzeba wykonać zainicjować obiekt UICollectionReusableView i zwrócić ten obiekt jako przykład poniżej, gdy nie chcesz niczego zwracać.

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 

return UICollectionReusableView() 

} 
3

Dla mnie osobiście, jeśli nie powiesz UICollectionView, aby wyświetlał stopki sekcji, to nie będzie ich pokazywał. Tak więc można umieścić preconditionFailure w tej metodzie delegatów.

Myślę, że to jest to, że UICollectionView nie zrobi rzeczy, o których więcej powiesz. Więc jeśli nie powiesz UICollectionView, aby wyświetlał stopki sekcji, to nie będzie ich pokazywał i będzie bezpieczne mieć preconditionFailure dla tych widoków stopek. Ale jeśli znajdziesz awarię w tym przypadku, to albo błąd UIKit, który powinieneś złożyć radar, aby poinformować Apple, albo to twój błąd, aby poprosić UICollectionView o niezamierzone wyświetlanie stopki sekcji.

Więc mój kod będzie wyglądać podobnie do tego

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
    switch kind { 
    case UICollectionElementKindSectionHeader: 
     let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, 
                    withReuseIdentifier: "MyHeaderView", 
                    for: indexPath) as! MyHeaderView 
     /* Configure your section header here */ 
     return headerView 
    default: 
     preconditionFailure("Invalid supplementary view type for this collection view") 
    } 
} 
1

Żadne z powyższych pracował dla mnie. W moim przypadku mam dwa obiekty UICollectionView w tym samym kontrolerze widoku. Pierwszy jest poziomy, wybierając element, który wyświetla poniżej UICollectionView, który jest pionowy i zawiera nagłówki sekcji.

Od Apple docs:

Metoda ta musi zawsze powrócić ważnego obiektu widoku. Jeśli nie chcesz dodatkowego widoku w danym przypadku, twój obiekt układu nie powinien tworzyć atrybutów dla tego widoku. Można też ukryć widoki, ustawiając właściwość isHidden odpowiednich atrybutów na wartość true lub ustawiając właściwość alpha atrybutów na 0. Aby ukryć widoki nagłówka i stopki w układzie przepływu, można również ustawić szerokość i wysokość tych widoków. do 0.

tak rozkolejkowania na headerView jak zwykle, bo jeśli nie i po prostu wrócić instancję UICollectionReusableView() Xcode będzie narzekać widok nagłówka nie jest rozkolejkowywana. A jeśli nie chcesz go wyświetlać z jakiegoś powodu (dla mnie, aż użytkownik wybierze element z górnego widoku kolekcji poziomej) - ustaw szerokość i wysokość headerView na 0.0 i zwróć je.

let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: collectionHeaderReuseIdentifier, for: indexPath) 
if objects.isEmpty { 
    headerView.frame.size.height = 0.0 
    headerView.frame.size.width = 0.0 
    return headerView 
} 
// Configure the header view here if needed 
return headerView 
Powiązane problemy