tableView:didSelectRowAtIndexPath:]:发送到解除分配的实例0xebba1b0的消息

时间:2012-08-30 03:47:25

标签: iphone objective-c ios ipad uitableview

我理解调用message sent to deallocated instance 0xebba1b0的原因,这是因为我正在向不再在内存中的对象发送消息。

所以这是我的情景。我有一个ZoomedViewController,里面有一个UITableView。 UITableView有一个自定义的UITableViewCell,它有一个属性标签作为子视图。当在属性标签上按下一个链接(它依次触发didSelectRowAtIndexPath)时,它会委托给我的MainViewController并在MainViewController中调用closeZoomedImageVC方法:

-(void) closeZoomedImageVC
{
    [self.zoomedImageContainer_ removeFromParentViewController];
    [self.zoomedImageContainer_.view removeFromSuperview];
}

问题是当触发didSelectRowAtIndexPath时,zoomedImageContainer_已经消失了。我如何解决这个问题?

为了更好地说明这一点,基本上当我这样做时:

 [self performSelector:@selector(closeZoomedImageVC) withObject:nil afterDelay:1.0];

这不会导致崩溃,但这不是一个解决方案,因为它是hacky。这样做是为了让didSelectRowAtIndexPath在被解除分配之前先执行。

3 个答案:

答案 0 :(得分:2)

UITableView中存储对ZoomedViewController的引用:

@property (nonatomic, strong) IBOutlet UITableView *tableView;

确保在Interface Builder中连接插座。现在,当您移除zoomedImageContainer_.view时,在您释放该引用之前,它不会取消UITableView。{/ p>

您还需要在strong中存储对ZoomedViewController的{​​{1}}引用,并在MainViewController中将所选行保存到nil 1}}。

答案 1 :(得分:0)

当点击表格中的单元格时会调用动画来突出显示所选单元格,并且需要短时间完成,所以最好的方法是你正在做的事情,延迟后执行选择器,我认为0.5秒就够了

答案 2 :(得分:0)

我发现自己的解决方案是在tableView属性中设置allowSelection = NO。这将让UITableViewCell中的attributionLabel进行交互,但会禁用被调用的didSelectRowAtIndexPath