我理解调用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在被解除分配之前先执行。
答案 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