2016-04-05 11 views
0

Ich habe meinen Hauptansicht-Controller, der eine UITableView zeigt. Jede Zelle davon ist benutzerdefiniert (Ich habe eine UIView für benutzerdefinierte Präsentation erstellt).Objective c - Einige Array-Elemente werden in meinem UITableView nicht angezeigt (einige werden zweimal angezeigt)

Für diese Elemente in meinem Tableview zeigt, besiedeln ich einen Array mit dem Inhalt der „allFilesFolderPath“ Ordner mit diesem Code:

- (void)configureView { 
    _itemArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:allFilesFolderPath error:nil]; 
} 

und

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [self.itemArray count]; 
} 

und ich meine benutzerdefinierten Zellen erstellen um sie anzuzeigen mit:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = [indexPath row]; 
    myItem = [self.itemArray objectAtIndex:row]; 
    NSLog(@"My Item : %@", _itemArray.description); 

    static NSString *CellIdentifer = @"cardCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifer]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifer]; 
    } 

    return cell; 
} 

Wenn ich das Array mit derdrucken, erhalte ich die richtige Liste von Elemente und in der alphabetischen Reihenfolge (wie, wie sie in den Dokumenten Lage auf meinem iPhone gespeichert sind):

My Item : (
Music, 
Music10, 
Music2, 
Music3, 
Music4, 
Music5, 
Music6, 
Music7, 
Music8, 
Music9, 
Photos, 
Videos 
) 

Aber wenn ich laufe die App in meinem iPhone (oder im Simulator), werden die Zellen korrekt (in der Reihenfolge) bis zum achten Punkt angezeigt. Nach dieser Nummer, in meinem Fall, anstatt "Music8", "Music9", "Photos", "Video" zu haben, komme ich zurück zum Anfang des Arrays, also "Music", "Music10", "Music2" und "Music3 "

Um besser zu verstehen, was ich bekommen, ist hier die Screenshots:

enter image description here

enter image description here

ich wirklich bin verloren! Ich habe gesucht (und suche wieder), was ich falsch mache, aber ich finde nichts, alles ist richtig für mich.

Bitte helfen Sie mir, mein Problem zu finden, so dass ich normal schlafen kann.

EDIT: Hier ist die Methode, die ich gesetzt habe die myItem Zeichenfolge aus meiner anderen Klasse abzurufen:

+ (NSString *)getItemName { 

    return myItem; 

} 

Und hier ist, wie ich es von meinen anderen Klasse abrufen:

NSString *test = [ViewController getItemName];  
_itemName.text = test; 

EDIT2: Hier ist der verwendete Code für die Einstellung meiner benutzerdefinierten TableViewCell (sorry für fehlende diesen Informationen

#import "TableViewCell.h" 

@implementation TableViewCell 

- (void)awakeFromNib { 
    // Initialization code 

    [self cardSetup]; 

} 



- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 



- (void)cardSetup { 

    _cardView.layer.masksToBounds = NO; 
    _cardView.layer.shadowOffset = CGSizeMake(0, 1); 
    _cardView.layer.shadowRadius = 1; 
    _cardView.layer.shadowOpacity = 0.3; 


    NSString *test = [ViewController getItemName];  
    _itemName.text = test; 

} 

@end 

Antwort

3

Es dieser Aufruf „dequeueReusableCell ...“ benannt ist. Erhalten werden sollen, Tabellenansichtszellen sind wiederverwendet. Wenn 8 Zellen auf den Bildschirm passen und Sie die Ansicht nach oben scrollen, wird in der neunten Zeile die Zelle verwendet, die für die erste Zeile verwendet wurde. Deshalb müssen Sie Ihre Zelle in cellForRowAtIndexPath einrichten, was Sie offensichtlich ablehnen.

Zellen werden nur zur Anzeige verwendet. Sie werden nicht zum Speichern von Daten verwendet. Sie sollten ein Datenmodell haben, auf das alle zugreifen können.cellForRowAtIndexPath liest aus diesem Datenmodell. Und wenn dann etwas passiert (zum Beispiel durch Antippen einer Schaltfläche in einer Zelle), das das Datenmodell ändert, dann ändern Sie das Datenmodell und das Datenmodell sollte allen interessierten Parteien mitteilen, dass sich das Modell geändert hat.

Ihre Zelle in einer Ansicht und eine UILabel woanders sollten definitiv nicht verbunden sein. Alle Änderungen sollten sich durch Ihr Datenmodell ausbreiten.

+0

Ich habe nicht daran gedacht, eine Klasse zu verwenden, um Daten zu speichern, und ich denke nicht Warum, wie es ein sauberes Modell ist! Ich werde das morgen versuchen, weil es spät ist, wo ich lebe, und Sie wissen lassen. Vielen Dank ! – Synny

+0

Also habe ich mein Datenmodell mit Hilfe von ray wenderlich tuto erstellt (https://www.raywenderlich.com/1797/ios-tutorial-how-to-create-a-simple-iphone-app-part-1). Ich habe eine Doc- und eine Data-Klasse festgelegt, die meinen Titel enthalten. Ich habe erfolgreich mein TableViewCellDoc-Objekt erstellt, aber wenn ich es in CellForRowAtIndexPath an mein Zellobjekt sende, bekomme ich nichts in das Label. Siehe den Code, den ich zum Senden verwende: TableViewCellDoc * item = [self.itemArray objectAtIndex: indexPath.row]; TableViewCell * cellItem = [[TableViewCell alloc] init]; cellItem.itemName.text = item.data.title; – Synny

+0

Hum Ich habe das Problem gefunden, es kam von der Initialisierung meiner Zelle in CellForRowAtIndexPath. Ich habe es wie UITableViewCell getan * cell = [tableView dequeueReusableCellWithIdentifier: @ "cardCell"]; anstelle von TableViewCell (meine benutzerdefinierte Klasse so) ** Zelle = [tableView dequeueReusableCellWithIdentifier: @ "cardCell"] ;. Ich kann jetzt alle Artikel über die Delegate-Methode drucken, danke :) – Synny

2

Sie verwenden nicht myItem überall in cellForRowAtIndexPath: Ihre Zellen scheinen ihren Text aus einem anderen Verfahren zu bekommen, wenn sie es von celForRowAtIndexPath:

+0

Bitte lesen Sie meine bearbeitete Frage, ich habe die Methode hinzugefügt, die ich zum Abrufen myItem Zeichenfolge aus meiner anderen Klasse – Synny

+0

@Synny verwenden, erwähnen Sie eine 'watchFromNib' Methode, die Sie noch nicht gebucht haben. – Gavin

+0

@Synny, Ihre '+ (NSString *) getItemName' Methode ist eine Klassenmethode, also ist das' myItem' darin nur eine einzelne Instanz und es wird wahrscheinlich auf viele verschiedene Zellen zugegriffen. Verwenden Sie stattdessen '[self.itemArray objectAtIndex: row]' in 'cellForRowAtIndexPath', um den Text festzulegen. Und wenn es nötig ist, leiten Sie es an andere Instanzmethoden weiter. Aber Sie sollten keine Klassenmethoden für so etwas verwenden. – Hash88

Verwandte Themen