2017-03-25 2 views
3

J'ai un contrôleur de vue avec UITableView. Les données de table est remplie à l'aide RxSwift:RxSwift + UITableViewCell comment obtenir l'objet de cellule dans heightForRowAt

let observable = Observable.just(data) 
observable.bindTo(tableView.rx.items(cellIdentifier: "CategoryCell", cellType: CategoryCell.self)) { (row, element, cell) in 
    cell.setCategory(category: element) 
}.disposed(by: disposeBag) 

tableView.rx.setDelegate(self).disposed(by: disposeBag) 

et j'ai la fonction de délégué suivante:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    // cell = nil. 
    let cell = tableView.cellForRow(at: indexPath) 

    let screenWidth = UIScreen.main.bounds.size.width 

    let itemWidth = (screenWidth/3.0) - 20 
    let itemHeight = (itemWidth)/0.75 + 110 

    return itemHeight 
} 

Je veux accéder à l'objet de cellules à l'intérieur heightForRowAt mais il me donne nil. Y a-t-il un moyen d'accéder à la cellule ici? J'ai regardé UITableView + Rx.swift dans le projet de RxCocoa mais il n'y a aucune fonction pour ceci. Quelles autres options ai-je?

EDIT: Je suis en train de réaliser ce qui suit dans mon code:

class CategoryCell : UITableViewCell { 
    func calculateHeight() { 
     let screenWidth = UIScreen.main.bounds.size.width 

     let itemWidth = (screenWidth/3.0) - 20 
     let itemHeight = (itemWidth)/0.75 + 110 

     return itemHeight 
    } 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    // cell = nil. 
    guard let cell : CategoryCell = tableView.cellForRow(at: indexPath) as? CategoryCell { 
     return 0.0 
    } 
    return cell.calculateHeight() 
} 
+0

Ajoutez le paramètre nécessaire au modèle et récupérez les informations dans le tableau de sources de données. – vadian

+0

J'ai une fonction dans la classe de cellule qui calcule la hauteur de la cellule. Je vais avoir plusieurs cellules prototypes, donc je veux l'unifier. Donc, il serait imprudent de mettre cette fonction dans un modèle qui fait partie de la logique métier. – Gasim

+0

s'il vous plaît vérifier ma modification pour clarification. – Gasim

Répondre

1

L'appel tableView.cellForRow(at: indexPath) renvoie nil en tableView(_: heightForRowAt:) parce heightForRowAt est appelée sur un indexPath particulier avant le cellForRowAt est appelé.

Le meilleur pari ici serait d'utiliser des cellules auto-dimensionnantes. (https://www.raywenderlich.com/129059/self-sizing-table-view-cells). Une autre option consisterait à conserver la taille des cellules dans votre modèle et à y accéder ici.