Frage

Ich bin in der Lage kundenspezifische UITableViewCells zu entwerfen und sie laden ganz gut mit der Technik im Thread beschrieben unter http://forums.macrumors.com/showthread.php?t=545061 . Jedoch mit dieser Methode nicht mehr können Sie die Zelle mit einem reuseIdentifier init, die bedeutet, dass Sie bei jedem Anruf ganz neue Instanzen der einzelnen Zelle zu schaffen haben. Hat jemand dachte, eine gute Möglichkeit, um noch bestimmte Zelltypen für Wiederverwendung zwischenzuzuspeichern, aber noch in der Lage sein, sie im Interface Builder zu entwerfen?

War es hilfreich?

Lösung

Nur eine Methode mit der entsprechenden Methodensignatur implementieren:

- (NSString *) reuseIdentifier {
  return @"myIdentifier";
}

Andere Tipps

Eigentlich, da Sie die Zelle in Interface Builder bauen, sondern nur die Wiederverwendung Kennung dort eingestellt:

IB_reuse_identifier

Oder wenn Sie Xcode laufen 4, überprüfen Sie die Registerkarte Attribute Inspektor:

eingeben Bild Beschreibung hier

(Edit:. Nach dem XIB von XCode generiert wird, wird eine leere UIView enthält, aber wir brauchen eine UITableViewCell, so müssen Sie manuell die UIView entfernen und eine Tabellenansicht Zelle einfügen Natürlich wird IB zeigen keine UITableViewCell Parameter für eine UIView.)

Nun, in iOS 5 gibt es eine entsprechende UITableView Methode dafür:

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

Ich kann mich nicht erinnern, wo ich diesen Code ursprünglich gefunden, aber es ist für mich bisher das Arbeiten groß.

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomTableCellView";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (UITableViewCell *)[nib objectAtIndex:0];
    }

    // perform additional custom work...

    return cell;
}

Beispiel Interface Builder Setup ...

Schauen Sie sich die Antwort, die ich auf diese Frage gab:

Ist es möglich, NSCell Subklassen im Interface Design Builder?

Es ist nicht nur möglich, eine UITableViewCell in IB zu entwerfen, ist es wünschenswert, da sonst alle die manuellen Verdrahtung und Platzierung von mehreren Elementen sehr mühsam ist. Performaance ist in Ordnung, solange Sie vorsichtig sind alle Elemente undurchsichtig zu machen, wenn möglich. Die reuseID ist für die Eigenschaften des UITableViewCell in IB gesetzt ist, dann verwenden Sie die passende Wiederverwendung ID in Code, wenn aus der Warteschlange entfernt versuchen.

ich auch von einigen der Referenten auf der WWDC im vergangenen Jahr gehört, dass Sie sollten nicht Tabellenansicht Zellen in IB, aber es ist eine Last von Koje machen.

Wie von iOS circa 4.0 gibt es spezielle Anweisungen in den iOS-Dokumenten, die dieses Werk super-schnell zu machen:

http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

Blättern Sie nach unten, wo es spricht über Subklassen UITableViewCell.

Hier ist eine weitere Option:

NSString * cellId = @"reuseCell";  
//...
NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil];

for (id obj in nibObjects)
{
    if ([obj isKindOfClass:[CustomTableCell class]])
    {
        cell = obj;
        [cell setValue:cellId forKey:@"reuseIdentifier"];
        break;
    }
}

ich meine benutzerdefinierte Ansicht Zellen in ähnlicher Weise erstellen - außer ich die Zelle durch eine IBOutlet verbinden

.

Der [nib objectAt...] Ansatz ist anfällig für Änderungen an Positionen der Elemente im Array.

Der UIViewController Ansatz ist gut -. Gerade versucht, und es funktioniert gut genug

...

In allen Fällen ist die initWithStyle Konstruktor nicht aufgerufen wird, so dass keine Standard-Initialisierung durchgeführt wird.

Ich habe verschiedene Orte über die Verwendung von initWithCoder oder awakeFromNib, aber keine schlüssigen Beweise gelesen, dass entweder von ihnen ist der richtige Weg.

Neben explizit etwas Initialisierungsverfahren im cellForRowAtIndexPath Methode aufrufen Ich habe keine Antwort auf diese noch.

gefunden

Vor einiger Zeit fand ich eine große Blog-Post zu diesem Thema unter blog.atebits.com und sind seit mit Loren Brichter ABTableViewCell Klasse begann alle meine UITableViewCells zu tun.

Sie enden mit einem einfachen Behälter UIView bis alle Ihre Widgets zu setzen, und Scrollen ist blitzschnell.

Hope dies sinnvoll ist.

Diese Technik funktioniert auch und nicht ein flippiges Ivar in Ihren View-Controller für die Speicherverwaltung erfordern. Hier wird die benutzerdefinierte Tabellenansicht Zelle lebt in einem xib namens „CustomCell.xib“.

 static NSData *sLoadedCustomCell = nil;

 cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
 if (cell == nil) 
 {
   if (sLoadedCustomCell == nil) 
   {        
      // Load the custom table cell xib
      // and extract a reference to the cell object returned
      // and cache it in a static to avoid reloading the nib again.

      for (id loadedObject in [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil]) 
      {
        if ([loadedObject isKindOfClass:[UITableViewCell class]]) 
        {
          sLoadedCustomCell = [[NSKeyedArchiver archivedDataWithRootObject: loadedObject] retain];
          break;
        }
    }
    cell = (UITableViewCell *)[NSKeyedUnarchiver unarchiveObjectWithData: sLoadedCustomCell];
  }

Louis Methode für mich gearbeitet. Dies ist der Code, den ich verwende, um die UITableViewCell von der Spitze zu erstellen:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"];

    if (cell == nil) 
    {
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];
        cell = (PostCell *)c.view;
        [c release];
    }

    return cell;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *simpleTableIdentifier = @"CustomCell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}         

return cell;
}

Die gustavogb Lösung nicht für mich arbeiten, was ich versucht ist:

ChainesController *c = [[ChainesController alloc] initWithNibName:@"ChainesController" bundle:nil];
[[NSBundle mainBundle] loadNibNamed:@"ChaineArticleCell" owner:c options:nil];
cell = [c.blogTableViewCell retain];
[c release];

Es scheint zu funktionieren. Die blogTableViewCell ist die IBOutlet für die Zelle und ChainesController ist der Eigentümer der Datei.

Von dem UITableView docs in Bezug auf dequeueWithReuseIdentifier: „. Eine Zeichenfolge mit der Zelle Objekt identifiziert wiederverwendet wird standardmäßig eine wiederverwendbare Zelle Kennung ist seine Klassennamen, aber man kann es auf jeden beliebigen Wert ändern“

Übergeordnete -reuseIdentifer selbst ist riskant. Was passiert, wenn Sie zwei Unterklassen Ihrer Zelle Unterklasse haben und in einer einzigen Tabelle Ansicht beides verwenden? Wenn sie den Wiederverwendung Kennung Anruf auf Super senden finden Sie eine Zelle vom falschen Typ dequeue .............. Ich glaube, Sie brauchen die reuseIdentifier Methode außer Kraft zu setzen, aber es hat eine verdrängte Kennung zurückgeben String. Oder, wenn man wurde nicht angegeben, hat es die Klasse als String zurück.

Für das, was es wert ist, fragte ich einen iPhone-Ingenieur über diese an einen des iPhone Tech Talk. Seine Antwort lautete: „Ja, es ist möglich IB zu verwenden, um Zellen zu schaffen. Aber dies nicht tun. Bitte nicht.“

Ich folgte den Anweisungen von Apple von Ben Mosher (danke!) Verbunden, wie aber gefunden, dass Apple einen wichtigen Punkt weggelassen. Das Objekt, das sie in IB Design ist nur ein UITableViewCell, wie die Variable sie von ihm laden. Aber wenn man es tatsächlich als eine benutzerdefinierte Unterklasse von UITableViewCell einrichten und die Code-Dateien für die Unterklasse schreiben, können Sie IBOutlet Erklärungen und IBAction Methoden im Code schreiben und verdrahten in IB zu Ihren benutzerdefinierten Elementen auf. Dann gibt es keine Notwendigkeit Ansicht Tags zu verwenden, um diese Elemente zuzugreifen und Sie können jede Art von verrückten Zelle erstellen, die Sie wollen. Es ist Cocoa Touch Himmel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top