2015-07-22 6 views
6

Lange Rede kurzer Sinn, ich möchte eine XIB-Datei erstellen, wo es enthält:UITableView und seine Zelle in einer xib Datei

  1. Eine Ansicht. In dieser Ansicht hat es viele Dinge und eine TableView. (verbundene Datenquelle, Delegieren an den Besitzer der Datei). Diese Ansicht ist die Hauptansicht der XIB-Dateien.

  2. Benutzerdefinierte Zelle, (als Prototypzelle von tableView verwenden, da XIB Prototyp tableView nicht unterstützt).

Wie kann ich beides erreichen? Auch ich möchte wissen, dass das gleiche gilt für UICollectionView.

Ich hatte beide erstellt, laden Sie es auf die Hauptansicht (die Hauptansicht ist im Haupt Storyboard). Die Tabellenansicht lädt die benutzerdefinierte Zelle jedoch nicht wie erwartet. Die Zelle ist nur leer, sieht nicht so aus, wie sie in der Feder entworfen wurde.

EDIT 1

Hier ist, wie ich mich registrieren um die Spitze in der Hauptansicht in Storyboard:

- (UIView *)buildViewFromViewControllerClass:(Class)viewControllerClass 
{ 
    id viewController = [[viewControllerClass alloc] initWithNibName:NSStringFromClass(viewControllerClass) bundle:nil]; 
    [viewController view].frame = self.containerView.bounds; 

    [self addChildViewController:viewController]; 

    return [viewController view]; 
} 

ich viele Viewcontrollers, so dass ich herausfinden, dass dies der beste Weg ist, VC hinzufügen .

Über die Feder in obiger Beschreibung, verwende ich nur regelmäßige Initialisierung:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // init cell 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; 
    if (!cell) { 
     cell = [[PaymentCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"]; 
    } 

    return cell; 
} 

Wenn in der Ansicht Load-Methode tat, ich die Feder in die Tableview registrieren, es in [tableView dequeueResuableCell...] abstürzen werden. Der registrierte Code:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

// [self.tableView registerNib:[UINib nibWithNibName:self.nibName bundle:nil] 
//    forCellReuseIdentifier:@"CustomCell"]; 
// I'm commenting it, because it caused crash. 
} 

Crash-Nachricht:

*** Beenden app aufgrund nicht abgefangene Ausnahme 'NSUnknownKeyException' Grund: ‚[ setValue: forUndefinedKey:]: Diese Klasse ist nicht Schlüssel Wert Codierung kompatibel für die SchlüsseltabelleView.

Was habe ich hier falsch gemacht? Hier ist ein Bild, wie ich die Feder entworfen:

Model

Wie Sie sehen können, die Hauptansicht des Datei Eigentümer an den mainView verbunden ist, wo es die Tableview enthalten. Die customCell ist nur eine benutzerdefinierte Zelle, die in derselben Datei (der .m-Datei) definiert ist.

+0

könnten Sie den Code hinzufügen, wie Sie die Zelle hinzufügen und Ihre Feder registrieren –

+2

Hier ist ein Beispiel, wie Sie eine Nib registrieren '[self.tableView registerNib: [UINib nibWithNibName: @" MyCell "bundle: nil" forCellReuseIdentifier: @ "MyCell"]; ' –

+0

Bitte schauen Sie sich * Edit 1 * – Eddie

Antwort

4

Sie sollten die Schreibfeder wie folgt registrieren.

[self.tableView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellReuseIdentifier:@"MyCell"] 

Ich habe im Allgemeinen gesehen, dass RegisterClass nicht die Ansicht lädt, sondern nur die Klasse. Ich weiß nicht warum.

Auch eine .xib sollte nur eine Ansicht enthalten. Also muss man für UITableViewCell und UITableView einen Unterschied machen. Der Grund dafür ist sehr einfach.Jedes Mal, wenn das Xib geladen wird, werden alle Ansichten innerhalb des Xib erstellt. Sie möchten nicht jedes Mal eine neue Tabelle erstellen, wenn Sie eine Zelle erstellen. Recht?

Wie für den Absturz Sie konfrontiert sind. Der Fehler sieht aus, als bestünde ein Problem mit dem Namen tableView. Versuchen Stellen zu entfernen und neu zu initialisieren sie

Zugänge

für eine UICollectionView Sie eine Klasse registrieren kann, wäre es Ihrer Ansicht von xib laden.

[self.collectinView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellIdentifier] 

aktualisieren

Wenn Sie ein Storyboard verwenden, können Sie nur zwei Prototypen Zellen hinzufügen und das wird zwei Zellen innerhalb des Tableview hinzuzufügen. Sie können alle Ansichten direkt dort hinzufügen und ihnen verschiedene Klassendateien geben. Würden Sie die Anzahl der XIB-Dateien reduzieren, die Sie pflegen müssen, und Sie müssen auch nicht Ihre Nibs registrieren. Dies könnte ein tutorial dafür sein

+0

Ich bin sehr enttäuscht, dies zu sagen: Es funktioniert tatsächlich, wenn ich die Ansicht in verschiedene XIB-Dateien aufspalte. Es ist nicht das, was ich von Anfang an wollte. Mal sehen, ob es eine bessere Antwort gibt. Bitte bestätigen Sie auch, ob diese Methode auch für CollectionView funktionieren soll. – Eddie

+0

Über eine bessere Antwort weiß ich nicht ... aber ich denke, das ist die richtige ... Sie können nicht zwei Ansichten in Xib haben, es ist einfach nicht effizient aus Sicht der Speichernutzung –

Verwandte Themen