2014-01-25 13 views
19

Ich versuche, einen anderen Ansichtscontroller in einer UITableView-Zelle hinzuzufügen. Die Idee ist, dass Sie auf die Zelle tippen, und es wird erweitert, um mehr Inhalt anzuzeigen - eine Messaging-Oberfläche. Es ist wichtig (denke ich), dass dies von einem separaten Messaging ViewController gesteuert wird.iOS-Containeransicht in UITableViewCell

Das Erweitern der Zelle und Ansichten innerhalb der Zelle mit den richtigen Einschränkungen erweitern ist eigentlich sehr einfach in Storyboards, also habe ich versucht, alles in Storyboards zu halten, indem ich meine neue VC der TableViewCell über einen Container hinzufügen. Auf diese Weise könnte ich Einschränkungen für die Containeransicht hinzufügen und den Inhalt von meiner Messaging-VC aus leiten.

Hier ist der Fehler:

Illegal Configuration: Container Views cannot be placed in elements that are repeated at runtime.

Jede Art und Weise, um dieses Problem zu bekommen, oder ist es eine Möglichkeit, ich Rohr von meinem Viewcontroller in diese tableviewcell die Ansicht kann und es hat zu einer Konfiguration beschränken, die ich gesetzt in Storyboards? Vielen Dank!

+1

Sieht aus wie dies möglich ist, aber nicht über ein Storyboard. http://stackoverflow.com/questions/14741951/using-a-uicollectionview-from-a-uicollectionviewcell – greg

Antwort

11

hatte ich die gleiche Aufgabe und beschlossen, es auf diese Weise:

Schritt 1. Unterklasse erstellen MyCell: UITableViewCell.

Schritt 2. Wenn Sie Self-Sizing Cells verwenden, fügen Sie in InterfaceBuilder UIView zu MyCell hinzu, und fügen Sie allen Seiten Höhenbeschränkungen und Einschränkungen hinzu. Diese Ansicht wird für die Höhe der Zelle benötigt. Wenn nicht, überspringen Sie diesen Schritt und verwenden Sie heightForRowAtIndexPath.

@interface MyCell: UITableViewCell 

@property (weak, nonatomic) MessagingVC *controller; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight; 

@end 

Schritt 4:

enter image description here enter image description here

Schritt 3. In MyCell.h Auslass aus dem Blickfeld Höhenbeschränkung und Reglereigenschaft hinzuzufügen. In cellForRowAtIndexPath Code hinzufügen:

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

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath]; 

    // adjust this for your structure 
    cell.controller = [[UIStoryboard storyboardWithName:@"MessagingVC" bundle:nil] instantiateInitialViewController]; 

    [self addChildViewController:cell.controller]; 
    [cell.controller didMoveToParentViewController:self]; 
    [cell.contentView addSubview:cell.controller.view]; 

    // if you use Self-Sizing Cells 
    cell.viewHeight.constant = 200; // set your constant or calculate it 

    return cell; 
} 

Schritt 5. hinzufügen didEndDisplayingCell Methode:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([cell isKindOfClass:[MessagingVC class]]) 
     [((MyCell*)cell).controller removeFromParentViewController]; 
} 
+0

Funktioniert! Vielen Dank! – Nekfeu

1

Machen Sie Ihren UITableViewController Inhalt als Static.

enter image description here

+19

Dies funktioniert nur, wenn Sie keine dynamischen Zellen benötigen !! –

1

können Sie ziehen Sie einfach Container Blick in UITableVeiw im Storyboard. Zum Beispiel können Sie es vor der Prototyp-Zelle ziehen, und Sie sehen den View-Controller Ihres Containers vor Ihren Prototyp-Zellen. Übrigens können Sie jedes Oberflächenelement in die Tabellenansicht ziehen. Ich bin mir nicht sicher, wie man mit dem automatischen Layout in der Kombination Tabellenansicht + Containeransicht umgeht, vielleicht müssen Sie Constraints zur Laufzeit manuell berechnen/setzen. Wird meine Antwort aktualisieren, wenn ich die richtige Lösung für das automatische Layout finden werde.

-3

Putting Container Ansichten in Tabellenansicht Zellen ist viel zu schwer. Tabellenansichtszellen sollten leichtgewichtig sein, damit der Benutzer sie schnell durchblättern kann. Es ist nicht notwendig, den gesamten View-Controller in jede Zelle zu legen. Die Zelle sollte nur einige der Daten für diese Zeile darstellen.

Wenn der Benutzer die Zelle berührt, verwenden Sie einfach einen normalen Übergang zum Messaging View Controller. Die Präsentation erfolgt automatisch. Erstellen und spezifizieren Sie dann einen animationController, um den Übergang so zu gestalten, als ob die Ansicht der Nachrichtenkomposition in der Tabellenansichtszelle enthalten wäre.

+2

Ich glaube, das OP möchte dem Benutzer bestimmte Daten in der Tabellenansichtszelle präsentieren. Wenn Sie also Recht haben, ist es nicht die Lösung, den Entwickler darauf zu beschränken, nur das Tapping auf die Zelle zu implementieren, um Daten anzuzeigen. Die Lösung besteht darin, etwas Leichteres zu verwenden als einen Seitenaufruf-Controller (d. H. Einen Sammlungsansicht-Controller, vielleicht?). Viele Apps betten Datensammlungen in andere Sammlungsobjekte ein. –