删除UIButton的目标操作

时间:2011-10-25 13:02:49

标签: iphone objective-c

我有一个UIButton,它被添加到tableview中的每个UITableViewCell(2个单元格除外)。 按钮的目标是UITableViewController。 我注意到,当操作被发送到错误的目标时,应用程序已崩溃。我假设这是因为目标已经以某种方式被解除分配(即使,如果UITableViewController已被释放,按钮不应该是可见的,也不能按下(并且应该自行解除分配)。)

我猜我需要使用removeTarget来平衡addTarget方法。像KVO和保留/释放。

但是我不知道该怎么做,因为我在cellForRowAtIndexPath:中创建并添加到单元格时只有对该按钮的引用?

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        UIButton *extraButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [extraButton setFrame:CGRectMake(0, 0, 60, 30)];
        [extraButton setTitle:@"Meta" forState:UIControlStateNormal];
        [extraButton addTarget:self action:@selector(extraButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        cell.accessoryView = extraButton;
    }

    if (indexPath.row == kNoExtraButtonRow) {
        cell.accessoryView.hidden = YES;
    } else {
        cell.accessoryView.hidden = NO;
    }
    //set textlabels etc...
    return cell;
}

7 个答案:

答案 0 :(得分:3)

需要这样做非常不寻常。更有可能的是,你以其他方式错误地管理内存。特别是,UIButton的目标通常应该是拥有该按钮的UIViewController。在大多数好的设计中,按钮的寿命始终比控制器短。你在其他地方保留UIButton吗?您是否使用nib文件来管理按钮或以编程方式生成按钮?人们在以编程方式创建UI元素时会意外地创建多个UI元素实例(这是nib文件首选的几个原因之一)。

您确定要为所有ivars使用访问器(特别是本例中的按钮)吗?直接访问ivars是开发人员创建重复UI元素的最常见方式。始终使用访问器(init和dealloc除外)。

答案 1 :(得分:2)

我认为这会有所帮助

[someControl removeTarget:nil 
               action:NULL 
     forControlEvents:UIControlEventAllEvents]; 

答案 2 :(得分:0)

如果您已为此子类化UIButton或已将子类化为UITableViewCell,那么您可以将代码放在那里以在取消分配单元格或按钮时删除按钮的目标操作。在UITableViewCell的dealloc中,你可以在它的按钮上调用removeTarget,或者在按钮的dealloc中它可以为自己调用removeTarget。

答案 3 :(得分:0)

您无需删除目标,请确保将Target设置为self。你的代码在我身上运行正常。

答案 4 :(得分:0)

假设表视图单元格进入重用队列并且不受影响地返回它,但作为一个完整性检查,也许你想要做的是( cell != nil )从出列的情况下,你想要removeTarget并重新建立目标。

基本上在-prepareForReuse的情况下执行你自己的内联( cell != nil )并在每种情况下设置整个事情(除了实际的表格单元格分配)。

答案 5 :(得分:0)

 [extraButton addTarget:nil action:@selector(extraButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

答案 6 :(得分:-1)

试试这个。

     if (cell == nil){

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]retain];
    UIButton *extraButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect]retain];
    [extraButton setFrame:CGRectMake(0, 0, 60, 30)];
    [extraButton setTitle:@"Meta" forState:UIControlStateNormal];
    [extraButton addTarget:self action:@selector(extraButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    cell.accessoryView = extraButton;
}

删除自动释放并在Tableviewcell分配和按钮分配中添加保留.....