UIButton-Parameter Null in Zielmethode übergeben

  • Ich versuche, das Ziel eines berührten UIButton-Ereignisses in einer Unterklasse von UITableCell (in IB entworfen) festzulegen, die diese Zelle löscht. Beim Ausführen im Simulator erhalte ich jedoch den folgenden Fehler:

    * Beenden der App aufgrund der nicht abgeholten Ausnahme 'NSInvalidArgumentException', Grund: ' * - [__NSPlaceholderArray initWithObjects: count:]: Es wird versucht, kein Objekt aus den Objekten [0] '

    einzufügen zu der Methode fein, stürzt jedoch immer direkt nach der Zeile NSArray arrayWithObject ab. Es scheint, dass die Ursache dafür ist, dass die an die Zielmethode übergebene Schaltfläche immer gleich Null ist.

    Ich gehe davon aus, dass dies ein Speicherproblem ist, aber ich bin ziemlich verblüfft wie man es reparieren kann. Muss ich die Zelle nur programmgesteuert erstellen, damit dies funktioniert, oder gibt es eine einfache Möglichkeit, das Ziel der Schaltflächenaktion als Haupt-ViewController vom Interface Builder festzulegen?

    Hier werden die Zellen im View Controller erstellt:

     -(UITableViewCell *)tableView:(UITableView *)tableView
        cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
    
        if(tableView==songList){
    
    
            static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    
            SongCell *cell = (SongCell *)[tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
    
            if(cell == nil) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SongCell" owner:self options:nil];
                cell = [nib objectAtIndex:0];
                [cell.addButton addTarget:self action:@selector(addToPlaylist:) forControlEvents:UIControlEventTouchUpInside];
    
    
            }
    
            NSUInteger row = [indexPath row];
            cell.songname.text = @"test";//[songListData objectAtIndex:row];
    
            return cell;
        }
    
        return nil;
    
    }
     

    Und hier ist die Zielmethode:

     -(void)addToPlaylist:(id)button{
    
        SongCell *song = (SongCell *)[(UIButton *)button superview];
        NSIndexPath *indexPath = [self.songList indexPathForCell:song];
        NSArray *rowToMove = [NSArray arrayWithObject:indexPath];
    
        [self.songList beginUpdates];
        [self.songList deleteRowsAtIndexPaths:rowToMove withRowAnimation:UITableViewRowAnimationFade];
        [self.songList endUpdates];
    
    }
     

    Jede Hilfe, die Sie anbieten können, wäre sehr dankbar.

    22 November 2011
    Luke
1 answer
  • Der Fehler ist b / c indexPath muss null sein. Ihr Codebeispiel enthält eine Reihe verdächtiger Dinge. Was ist Ihre Implementierung von SongCell? Wenn Sie einer Zelle Subviews hinzufügen, sollten Sie diese direkt in die Zelle contentView vs der Zelle einfügen. Es ist ähnlich, dass [button superview] die Zelle nicht zurückgibt und daher die nächste Zeile nil für indexPath zurückgibt.

    Einige andere Gedanken:

    1. Anscheinend benötigen Sie nur die Zeilennummer, wenn Sie die Taste drücken. Sie könnten den rowIndex + 1 in der Button-Tag-Eigenschaft speichern und dann - 1 in addToPlaylist: abrufen. Sie müssen +/- b / c angeben. Die Tag-Eigenschaft sollte & gt; 0. Verwenden Sie alternativ eine UIButton-Unterklasse mit einer Eigenschaft zum Speichern von indexPath.

    2. Wenn Sie eine Zeile über deleteRowsAtIndexPaths:withRowAnimation: löschen, müssen Sie dies tun Löschen Sie zunächst dieselbe Zeile aus der Datenquelle, um die Integrität der Tabelle zu erhalten.

    3. Wenn Sie nur eine einzige Löschung durchführen, benötigen Sie beginUpdates / endUpdates.

    22 November 2011
    XJones