在目标方法中传递UIButton参数nil

时间:2011-11-22 00:54:50

标签: iphone objective-c uitableview uibutton

我正在尝试在UITableCell(在IB中设计)的子类中正确设置UIButton触摸事件的目标,该子类将删除该单元格。但是,当在模拟器中运行时,我收到以下错误:

  

*由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:'* - [__ NSPlaceholderArray   initWithObjects:count:]:尝试从对象[0]'

插入nil对象

它使方法很好,但它总是在NSArray arrayWithObject行之后崩溃。看来这是因为传递给目标方法的按钮总是为零。

我认为这是一个内存问题,但我对如何修复它感到困惑。我是否只需要以编程方式完全创建单元格以使其工作,或者是否有一种简单的方法可以以某种方式将按钮操作的目标指定为Interface Builder中的主ViewController?

这是在视图控制器中创建单元格的位置:

-(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;

}

这是目标方法:

-(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];

}

非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

错误是b / c indexPath必须为零。您的代码示例中有许多可疑内容。您对SongCell的实施是什么?将子视图添加到单元格时,应将它们添加到单元格的contentView vs直接添加到单元格。可能[button superview]没有返回单元格,因此下一行正在为nil返回indexPath

其他一些想法:

  1. 按下按钮时,您似乎只需要行号。您可以将rowIndex + 1存储在按钮标记属性中,然后检索它 - addToPlaylist:中的1。你需要+/- b / c标签属性应该是> 0.或者使用具有属性的UIButton子类来存储indexPath

  2. 如果您要通过deleteRowsAtIndexPaths:withRowAnimation:删除一行,则需要先从数据源中删除相同的行,以保持表格的完整性。

  3. 如果您只进行一次删除,则不需要beginUpdates / endUpdates