2017-02-13 4 views
0

Ich versuche, ein UITableView eine bestimmte Anzahl von Zeilen für einen Abschnitt, aber auch wenn ich vergewissere, dass seine Datenquelle x Anzahl der Zeilen für NumberOfRowsInSection zurückgibt, die Tabellenansicht zeigt x-1.UITableView zeigt eine inkonsistente Anzahl von Zeilen im Vergleich zur Datenquelle

Die Ausnahme von diesem unerwarteten Verhalten, wenn die numberOfRowsInSection kleiner als 3

Ich habe sogar einen Haltepunkt in cellForRowAtIndexPath setzen und ich bestätigte es für die Zeile genannt wird, die nicht angezeigt wird.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (section == SectionNumber_One) { 
     return 6; 
    } else { 
     return self.numberOfProjectRows; // This returns x, but x-1 rows are being shown 
    } 
} 

Wenn beispielsweise self.numberOfProjectRows 5 ist, nur 4 Zeilen werden für den zweiten Abschnitt gezeigt.

Wenn ich es manuell auf 6 erhöhen, zeigt es 5 Zeilen, aber die Daten, die in der 5. Position sein sollten, ist nicht da.

Es scheint nicht zu Bildschirmgröße zu sein, wie ich es auf einem iPad mit den gleichen Ergebnissen getestet habe.

Warum passiert das? Gibt es einen anderen möglichen Modifizierer für die Anzahl der Zeilen in einem Abschnitt?

Ich füge einen Screenshot an, wenn es hilft.

UITableView screenshot

EDIT - Hier sind meine Delegatmethoden:

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

    // Cell with reuse identifier setup 

    if (section == SectionNumber_One) { 
     // cell setup for section one that's showing up ok 
    } else if (section == SectionNumber_Two) { 
     UITextField *projectField = cell.projectTextField; 
     if ([self.userProjectKeys count] > row) { 
      projectField.text = self.availableProjects[self.userProjectKeys[row]]; 
     } 
    } 
    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Hide the password row for existing users 
    if (indexPath.row == FieldTag_Password && ![self.user.key vol_isStringEmpty]) { 
     return 0.0f; 
    } else { 
     return UITableViewAutomaticDimension; 
    } 
} 
+1

Können Sie mehr von Ihrem Viewcontroller-Code zeigen? –

+1

Das Problem liegt wahrscheinlich nicht in Ihren Datenquellenmethoden, sondern in Ihren Delegiertenmethoden. Wenn Sie keine korrekte Höhe für die Zelle zurückgeben, wird sie nicht angezeigt. ** Sie müssen den Code zu Ihren tatsächlichen Delegate-Methoden zu Ihrer Frage hinzufügen **, wo Sie die Höhe der Zelle festlegen, wenn Sie weitere Hilfe benötigen. Es spielt keine Rolle, wenn Sie 1000 Zellen in Ihre Datenquelle schreiben. Wenn Sie die Höhe nicht zurückgeben, werden sie nicht angezeigt. Sie sollten den cellForRow-Methoden auch Code hinzufügen. –

+0

@Sneak Vielen Dank !!! Du hast den Nagel auf den Kopf getroffen. Ich änderte die Höhe einer Reihe, dachte nur an Abschnitt 0 und vergaß, dass es auch Abschnitt 1 ändern würde. –

Antwort

1

Das Problem ist wahrscheinlich nicht in Ihrer Datenquelle Methoden, aber Ihre Delegierten Methoden, tableView(_:heightForRowAt:). Wenn Sie nicht eine korrekte Höhe für die Zelle zurückgeben, wird es nicht angezeigt.

Es spielt keine Rolle, wenn Sie 1000 Zellen in Ihre Datenquelle schreiben. Wenn Sie die Höhe nicht zurückgeben, werden sie nicht angezeigt.

0

Sie nicht bei der Umsetzung der Tabelle auf das MVC-Muster sind comforming. Sie müssen die Anzahl der Datenquellen der TabelleView und keine Variablen davon zurückgeben.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (section == SectionNumber_One) { 
     return 6; 
    } else { 
     return [_displayingArray count]; // <-- here 
    } 
} 

Wenn Sie für die einzelnen Abschnitte verschiedene Einzelteile wünschen, erklären dann unterschiedliche Datenquellen (dh Array) für jeden von ihnen.

BEARBEITEN: Selbst die Rückkehr konstant 6 ist in dem anderen Abschnitt gefährlich - Sie sollten Elemente zu einem anderen festen Array hinzufügen und die Anzahl der Arrays in diesem Delegaten zurückgeben.

+0

self.numberOfProjectRows ist gleich [self.displayingArray count] + 1, weil ich brauche es, um eine weitere leere Zeile anzuzeigen. Returning Konstante 6 war nur zum Testen. Vielen Dank! –

+1

Da irren Sie sich. Wenn Sie eine weitere Zeile hinzufügen möchten, müssen Sie ein leeres Element in self.displayingArray hinzufügen. Es ist besser so. Nehmen Sie Änderungen immer an der Datenquelle und nicht an den Delegaten vor. – GeneCode

Verwandte Themen