2012-03-26 13 views
8

Ich benutze Xcode 4.2 mit Storyboard, um eine iPhone App zu erstellen.Fügen Sie die Zelle am Ende von UITableView in iOS

Wenn ich die Bearbeitungsschaltfläche in der oberen rechten Ecke drücke, möchte ich die Optionen haben, die vorhandenen Zeilen zu löschen und die zusätzliche Zelle (mit dem grünen '+' Symbol) oben zu sehen, die ich hinzufügen könnte eine neue Zelle.

Ich habe ein Array, das in der viewDidLoad Verfahren bevölkert wird Coredata mit

I aktiviert haben die Schaltfläche Einstellungen

self.navigationItem.rightBarButtonItem = self.editButtonItem; 

und umgesetzt Methode

- (void)tableView:(UITableView *)tableView commitEditingStyle: 
      (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath: 
        (NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // removing a cell from my array and db here... 
    } 
    else if (editingStyle == UITableViewCellEditingStyleInsert) { 
     // adding a cell to my array and db here... 
    } 
} 

Ich weiß, ich brauche um die Zelle irgendwann hinzuzufügen, die ich dann bearbeiten kann, aber mir ist nicht klar, wo und ich finde keine Erklärung im Internet.

Antwort

18

Ok, der Grundgedanke ist, dass wenn die Schaltfläche Bearbeiten angeklickt wird, wir die Löschsteuerelemente neben jeder Zeile anzeigen und eine neue Zeile mit dem Steuerelement add hinzufügen, damit Benutzer darauf klicken können, um ein Eintragsrecht hinzuzufügen ? Erstens, da Sie bereits über die Bearbeitungsschaltfläche verfügen, weisen wir unsere Tabelle an, dass wir im Bearbeitungsmodus eine zusätzliche Zeile anzeigen sollten. Wir tun das in unserer tableView:numberOfRowsInSection:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return self.editing ? a_recs.count + 1 : a_recs.count; 
} 

a_recs hier das Array ich Setup haben unsere Daten zu speichern, so dass Sie das mit Ihrem eigenen Array wechseln werden müssen. Als nächstes sagen wir unseren tableView:cellForRowAtIndexPath: was mit der zusätzlichen Zeile zu tun:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *CellIdentifier = @"Cell"; 
    BOOL b_addCell = (indexPath.row == a_recs.count); 
    if (b_addCell) // set identifier for add row 
     CellIdentifier = @"AddCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     if (!b_addCell) { 
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     } 
    } 

    if (b_addCell) 
     cell.textLabel.text = @"Add ..."; 
    else 
     cell.textLabel.text = [a_recs objectAtIndex:indexPath.row]; 

    return cell; 
} 

Wir wollen auch unseren Tisch instruieren, dass für diese Zeile fügen wir das Hinzufügen-Symbol wollen:

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == a_recs.count) 
     return UITableViewCellEditingStyleInsert; 
    else 
     return UITableViewCellEditingStyleDelete; 
} 

Butter. Nun ist die super-geheime Kung-Fu-Soße, die sie alle zusammen mit Stäbchen hält:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated { 
    [super setEditing:editing animated:animated]; 
    [self.tableView setEditing:editing animated:animated]; 
    if(editing) { 
     [self.tableView beginUpdates]; 
     [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:a_recs.count inSection:0]] withRowAnimation:UITableViewRowAnimationLeft]; 
     [self.tableView endUpdates];   
    } else { 
     [self.tableView beginUpdates]; 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:a_recs.count inSection:0]] withRowAnimation:UITableViewRowAnimationLeft]; 
     [self.tableView endUpdates]; 
     // place here anything else to do when the done button is clicked 

    } 
} 

Viel Glück und guten Appetit!

+0

:) =) kein Problem! – ragamufin

+0

Wenn ich diese Methode verwende, bemerke ich, dass die Einfügereihe, die wir hinzufügen und entfernen, das blaue Auswahlsymbol auf der rechten Seite für einen kurzen Moment zeigt, wenn sie entfernt wird. Es hat damit zu tun, dass die Tabelle vor dem Entfernen der Zeile aus dem Bearbeitungsmodus genommen wird. Ich habe versucht, den Aufruf 'beginUpdates' über den Aufruf 'setEditing' von tableView zu verschieben, aber dann wird das blaue Symbol angezeigt, wenn die Zeile hinzugefügt und nicht entfernt wird. Irgendwelche Ideen, wie man dieses blaue Auswahlsymbol vermeidet? – Ryan

+0

Es klingt, als ob AccessoryType irgendwo gesetzt oder in der tableView-Queue zwischengespeichert wird. Versuchen Sie, es explizit auf UITableViewCellAccessoryNone festzulegen, wenn Sie eine Zelle hinzufügen. – ragamufin

4

This tutorial ist eine Lektüre wert und sollte Ihnen helfen. Es zeigt, wie die Einrichtung eine ‚Neue Zeile‘ UITableView Zeile am unteren Rande eines UITableView, aber man sollte dies an der Spitze Ihres UITableView in Ihrer Implementierung von erscheinen zu lassen fähig sein:

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

z.B.

if(self.editing && indexPath.row == 1) 
{ 
    cell.text = @"Insert new row"; 
    ... 

Hoffe, das hilft!

Verwandte Themen