2017-07-27 5 views
1

Ich habe mehrere Zellen in meiner Tabellenansicht; z.B. Katzenzelle, Hundezelle, Hühnerzelle. In der Katzzelle habe ich zwei Ansichten: eine Graphikansicht und eine Bildansicht.Tabellenansicht Zellenhöhe

Wenn die Diagrammansicht ausgeblendet ist und die Bilderansicht sichtbar ist, möchte ich die Zellenhöhe auf 200 und 350 im umgekehrten Fall einstellen.

Wie würde ich das erreichen? Ich registriere meine Nib-Datei in der Delegate-Methode der Tabellenansicht und ich habe verschiedene Dinge ausprobiert, ohne Erfolg. Dies sind die beiden Ansichten in meiner Zelle:

@property (weak, nonatomic) IBOutlet UIView *imagesView; 
@property (weak, nonatomic) IBOutlet UIView *graphView; 

... und das ist mein heightForRowAt Methode:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    TrainingImageCell *cell = (TrainingImageCell*)[self.tableView dequeueReusableCellWithIdentifier:@"TrainingImageCell"]; 
    if (cell.isGraphViewOnTop == YES) { 
     return 350; 
    } 
    else { 
     return 200; 
    } 
    return 200; 
} 
+0

Warum registrieren NIB-Datei in heightForRowAt. Sie registrieren neue Zelle und können daher nicht auf die ausgehende Zelle zugreifen. Wenn Sie möchten, dass es in Ihrem Stil funktioniert, anstatt eine neue Zelle in der Höhe für die Zeile bei IndexPath zu registrieren, können Sie mit indexPath auf die vorhandene Zelle als TrainingImageCell * currentCell = (TrainingImageCell *) zugreifen [tableView cellForRowAtIndexPath: indexPath]; und prüfen Sie die Eigenschaft. – luckyShubhra

+0

Es ist nicht zulässig, die Methode dequeueReusableCellWithIdentifier in heightForRowAtIndexPath zu verwenden. Weil die erste heightForRowAtIndexPath-Methode aufgerufen und dann die cellForRowAtIndexPath-Methode aufgerufen wird. Wenn Sie mir einen Code der cellForRowAtIndexPath-Methode zeigen, kann ich Ihnen helfen. –

+0

Ich habe diesen Teil @ YagneshDobariya Ich muss es wie in den Antworten erwähnt verwenden, aber ich habe Probleme mit Reload Tableview. Ich habe eine bool-Eigenschaft isShowingGraphView definiert und meine Ansichten in cellForRowAt nach dem Registrieren der Nib ein- und ausgeblendet. Ich rufe diese Eigenschaft in heightforRowAt und gegen die bool zurückkehrende Höhe, aber wenn ich rufe, lädt TableView ganze Ansicht verschwindet. –

Antwort

2

Statt eine neue Zelle initiieren, müssen Sie die eine für den Zugriff auf, was bereits in die tableView.

Statt

TrainingImageCell *cell = (TrainingImageCell*)[self.tableView dequeueReusableCellWithIdentifier:@"TrainingImageCell"]; 

Do

TrainingImageCell *currentCell = (TrainingImageCell*)[tableView cellForRowAtIndexPath:indexPath]; 

Und als auf dem Grundstück einen Blick darauf werfen.

EDIT: an der langen Diskussion suchen wir haben, hier ist ein sehr zuverlässiges Beispiel für einen Ansatz, den Sie in Swift nutzen könnten.

import UIKit 

class RightAlignedCell: UITableViewCell { 
    @IBOutlet weak var titleLabel: UILabel! 
    @IBOutlet weak var subLabel: UILabel! 
    // Your boolean property you would like to map 
    var randomBool: Bool = false 
} 

class RightAlignedTableViewController: UIViewController { 
    // This is just an example for the dataSource, you should have this somewhere already 
    lazy var dataSource: [Bool] = { 
     var dataSource: [Bool] = [] 
     for index in 0..<10 { 
      dataSource.append(index % 2 == 0) 
     } 
     return dataSource 
    }() 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.delegate = self 
     tableView.dataSource = self 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     tableView.reloadData() 
    } 
} 

extension RightAlignedTableViewController: UITableViewDelegate {} 

extension RightAlignedTableViewController: UITableViewDataSource { 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 10 
    } 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     // Take a look in the !!!dataSource!!!, what is value for isHidden 
     let isHidden = self.dataSource[indexPath.row] 
     // return the right height 
     return isHidden ? 60 : 100 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell: RightAlignedCell = tableView.dequeueReusableCell(withIdentifier: "RightAlignedCell", for: indexPath) as! RightAlignedCell 
     cell.titleLabel.text = "Something" 
     cell.subLabel.text = "Nothing" 
     cell.randomBool = self.dataSource[indexPath.row] 

     return cell 
    } 
} 
+0

Ja, ich kann auf die Eigenschaften wie das zugreifen, was ich versuche zu tun ist if (currentCell.graphView setHidden: YES) { Rückkehr 350; } sonst { Rückkehr 200; }, aber es gibt mir einen Fehler, ps isGraphViewOnTop ist nur ein bool, so allein es würde nicht wissen, was zu tun ist, wenn ja oder nein. Ich benutze es irgendwo in einer Funktion. Verzeihen Sie meine Unwissenheit, aber ist es der richtige Weg, sich dem zu nähern, was ich erreichen möchte? –

+0

Nein, es ist nicht der richtige Ansatz. Hier sollten Sie nur auf die Flagge schauen, wenn es "wahr" oder "falsch" ist, und einen Wert zurückgeben. tun Sie irgendwo -> '[currentCell.graphView setHidden: YES]' und dann neu laden Sie die Tabellenansicht ([tableView RealodData]), so dass die Höhe erneut gefragt wird. – dirtydanee

+0

Ich rufe ([tableView realodData]) in meinem cellForRowAt auf, aber das Problem ist, dass meine gesamte Ansicht verschwindet, wenn ich sie auskommentiere. Ich habe auch versucht, ReloadRowsatindexpath mit 0,0, da diese Zelle nur für indexPath = 0 ausgeführt wird, aber die App abstürzt, wenn ich das tue. –

0

Wenn Sie dequeueReusableCellWithIdentifier Sie gerade eine neue Zelle bekommen, wird es keine Daten zu überprüfen, ob isGraphViewOnTop

Mein Rat UITableViewAutomaticDimension und setzen Zell Ansichten mit Konstanten zurückzubringen wird, so dass, wenn das Element versteckt, wird eine Zelle eine kleinere Größe haben.

1

Warum registrieren NIB-Datei in heightForRowAt. Sie registrieren neue Zelle und können daher nicht auf die vorhandene Zelle zugreifen. Wenn Sie es in Ihrem Stil arbeiten wollen, anstatt Registrierung neue Zelle in der Höhe für Zeile bei IndexPath können Sie vorhandene Zelle zugreifen indexPath als

TrainingImageCell *currentCell = (TrainingImageCell*)[tableView cellForRowAtIndexPath:indexPath]; 

und Zugriffsprüfung Eigenschaft.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
TrainingImageCell *currentCell = (TrainingImageCell*)[tableView cellForRowAtIndexPath:indexPath]; 
    if (cell.isGraphViewOnTop == YES) { 
    return 350; 
    } 
return 200; 
} 
+0

Ja, ich bin in der Lage, auf die Eigenschaften zuzugreifen, was ich versuche zu tun ist, wenn (currentCell.graphView setHidden: YES) {return 350; } else {Zurück 200; } aber es gibt mir einen Fehler, ps isGraphViewOnTop ist nur ein bool, also würde es selbst nicht wissen, was zu tun ist, wenn es auf ja oder nein gesetzt ist. Ich benutze es irgendwo in einer Funktion. Verzeihen Sie meine Unwissenheit, aber ist es der richtige Weg, sich dem zu nähern, was ich erreichen möchte? –

+0

Wo verwenden Sie es ?? Sie müssen Flag-Werte für isGraphViewOnTop in cellForRowAtIndexPath festgelegt haben, dann können Sie es hier verwenden. – luckyShubhra

+0

Sie können AutoLayout und UIAutomatic Dimension für die Höhe für Row anpassen. – luckyShubhra

Verwandte Themen