2016-08-24 2 views
0

Ich verwende eine nicht klickbare Tabelle, um verschiedene Informationen eines Objekts anzuzeigen. Für diese Informationen habe ich verschiedene benutzerdefinierte Zelltypen eine, wo ich eine Karte platziert, wenn mein Objekt Standorte, eine Liste mit Links und eine andere eine mehrzeilige Beschriftung für eine kleine Beschreibung haben ... zum Beispiel.Variable Verwendung von mehreren benutzerdefinierten Zellen

ich diese Unter Zellen mit:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

if indexPath.row == 0 { 
    let cell: mapCell = tableView.dequeueReusableCellWithIdentifier("mapCell") as! MapCell 
    return cell 
} else if indexPath.row == 1 { 
    let cell: textCell = tableView.dequeueReusableCellWithIdentifier("textCell") as! TextCell 
    return cell 
} else if indexPath.row == 2 { 
    let cell: listCell = tableView.dequeueReusableCellWithIdentifier("listCell") as! ListCell 
    return cell 
} 

} 

So weit, so gut, alles gut funktioniert. Mein Problem ist, dass nicht jedes Objekt eine Karte benötigt, einige brauchen nur etwas Text und eine Liste, andere Objekte brauchen eine Karte und eine Liste, alle anderen. Ich möchte, dass meine TableView einige Zellen überspringt, wenn eine Bedingung vorliegt.

Ich weiß, ich kann ein symbolisches Array für die Änderung der Anzahl der Zellen meiner TableView machen, aber das Löschen nur vom Ende meiner TableView, nicht bestimmte Zellen.

Eine meiner Ideen ist es, eine leere Zelle zu erzeugen, vielleicht mit einer Höhe von 0 oder 1, so dass ich etwas tun kann:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

if indexPath.row == 0 { 
    if mapCellNeeded { 
      let cell: mapCell = tableView.dequeueReusableCellWithIdentifier("mapCell") as! mapCell 
    } else { 
      let cell: emptyCell = tableView.dequeueReusableCellWithIdentifier("emptyCell") as! EmptyCell 
    } 
    return cell 
} else if indexPath.row == 1 { 
    ... 
}... 
} 

put Ich weiß nicht, ob es nicht ist ein effizienter Weg. Ich hoffe, ihr könnt mir helfen.

+0

Erstellen Sie ein Array von Objekten, wo Sie Zellen Informationen, die Sie benötigen, halten, dann machen Sie nicht leere Zellen nur so viele Zellen wie Sie in diesem Array haben. wenn du versuchst, leere Zelle zu machen, bedeutet das, dass du sie überhaupt nicht brauchst. –

Antwort

0

Ihre Lösung würde funktionieren. Ein weiterer Ansatz (sehr schön und swifty) wäre nicht Zeilennummern zu codieren, sondern Enum anstelle:

enum InfoCellType { 
case Map 
case Text 
case Links 
} 

... 

var rows = [InfoCellType]() 
... 
// when you know what should be there or not 
func constructRows() { 

if (mapCellNeeded) { 
rows.append(InfoCellType.Map) 
} 
rows.append(InfoCellType.Text) 
... etc 
} 

dann in der Tabellenansicht Methoden sehen, was der Typ ist für aktuellen indexPath:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

let cellType: InfoCellType = self.rows[indexPath.row] 
switch cellType { 
case .Map: 
    let cell: mapCell = tableView.dequeueReusableCellWithIdentifier("mapCell") as! mapCell 
    return cell 
case .Text: 
    ... 
case.Links: 
    ... 
} 
} 

Diese Lösung ermöglicht auch die einfache Reihenfolge der Zeilen ändern - ändern Sie einfach die Reihenfolge der Elemente in rows Array.

+1

Ja, das sieht sehr nett aus, ich versuche das morgen und berichte. Danke – kuemme01

+1

Ich konnte nicht bis morgen warten. Es funktioniert perfekt! Ich liebe dieses Forum! Grüße – kuemme01

+0

Froh ich könnte helfen :) – hybridcattt

Verwandte Themen