2016-06-01 8 views
0

In meiner App bekomme ich ein Objekt von NSNotificationCenter (bilden einen anderen Controller) und fügen Sie das Objekt UITableView:Falsche Objekt hinzugefügt UITableView

-(void)viewWillAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(RosterSave:) name:@"RosterSave" object:nil]; 
} 

-(void)RosterSave:(NSNotification *)notification 
{ 
    NewRoster* newRoster = [[NewRoster alloc]init]; 
    newRoster = notification.object; 
    [myUser.rosterArray addObject:newRoster]; 
    [self.myRoster reloadData]; 
} 

Dies ist die Tableview-Methode:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return myUser.rosterArray.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    NSString *iden = @"MyTable"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:iden]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:iden]; 
    } 
    NewRoster* myNewRoster = [myUser.rosterArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text = myNewRoster.nameRoster; 
    return cell; 
} 

Wenn Der Benutzer fügt das erste Objekt hinzu, die TabelleView erhält eine eigene Zeile. Wenn der Benutzer das zweite Objekt hinzufügt, fügt er zwei Zeilen des zweiten Objekts und auf diesem Weg hinzu.

Wie kann ich dieses Problem beheben?

+1

Können Sie überprüfen, wie oft 'RosterSave:' aufgerufen wird? Und überprüfe 'myUser.rosterArray' jedes Mal darin? – Larme

+0

mit welchem ​​Problem haben Sie konfrontiert? – Feroz

+0

Können Sie die Antwort bearbeiten und genau auf Ihr Problem hinweisen? – EridB

Antwort

1

Sie haben observer(notification) in viewWillAppear hinzugefügt, die jedes Mal aufgerufen werden, wenn Ansicht angezeigt wird.

Benachrichtigung in viewDidLoad anstelle von viewwillAppear hinzufügen.

1

Ich möchte immer NSNotification Subskriptionen in Init/und Abmeldungen in Dealloc setzen. Dieses Muster ist leicht zu lesen und zu debuggen. Außerdem garantiert es, dass Sie sich niemals doppelt anmelden oder abmelden.

In Ihrem Fall sind Sie mehrere Abos zur Schaffung anfällig in viewWillAppear

- (instancetype)init 
{ 
    ... 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(RosterSave:) name:@"RosterSave" object:nil]; 
    ... 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
0

@Feroz rechts ist über Sie ein neues Objekt Aufteilung und es mit notification.object ersetzen. @Lion hat recht mit viewDidLoad vs. viewDidAppear Sie generieren mehrere Benachrichtigungen. Sie müssen nur einen pro Objekt generieren. Setzen Sie einen Haltepunkt in Ihren RosterSave-Code und zählen Sie, wie oft er pro neuem Objekt aufgerufen wird. Sehen Sie sich auch den Stack-Trace an, um zu sehen, wer diese Anrufe generiert. Es geht darum, durchzugehen, den Code zu verstehen und zu sehen, was passiert.

+0

Ich würde init statt viewDidLoad bevorzugen. – Feroz

+0

@Sanjit ist auch korrekt mit RemoveObserver sowie hinzufügen. Die ursprüngliche Benachrichtigung ist wahrscheinlich immer noch vorhanden, wenn viewDidAppear aufgerufen wird, und dann wird eine weitere hinzugefügt. –

Verwandte Themen