[英]removeFromSuperView not working on button
我要折磨的另一个问题。 我已经以编程方式创建了一个UIButton。 唯一的目的是站在另一个按下按钮半秒钟的按钮之上。 底部按钮是图片,顶部按钮是垃圾桶。 您可以在这里看到我要执行的操作:我有一张照片,要删除它,您必须将其按下一会儿。
if (CGRectContainsPoint(self.capturedImageOneSmall.frame, tapAndHoldPoint)) {
aboutToDeleteImageTrashCan = [[UIButton alloc] init];
aboutToDeleteImageTrashCan.frame = self.capturedImageOneSmall.frame;
[aboutToDeleteImageTrashCan setBackgroundImage:[UIImage imageNamed:@"LogoTrashcan"] forState:UIControlStateNormal];
[aboutToDeleteImageTrashCan addTarget:self action:@selector(deleteImage:) forControlEvents:UIControlEventTouchUpInside];
aboutToDeleteImageTrashCan.tag = 1;
[self.scrollView addSubview:aboutToDeleteImageTrashCan];
当我调用删除两个按钮的方法时,只有图片消失了,垃圾桶仍留着,甚至仍然可以被点击。
- (void)deleteImage:(UIButton *)sender
{
if (aboutToDeleteImageTrashCan.tag == 1) {
[self.capturedImageOneSmall removeFromSuperview]; //this works!
self.capturedImageOneSmall = nil;
capturedImageOneData = nil;
}
[aboutToDeleteImageTrashCan performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO]; //this doesn't!
aboutToDeleteImageTrashCan = nil;
你们有什么主意吗?
将语句放在包含“ performSelectorOnMainThread”调用的行的紧前面时,是否可以显示该语句的输出:
NSLog(aboutToDeleteImageTrashCan: %@, aboutToDeleteImageTrashCan);
是的,看到它们具有不同的内存地址吗? (0x15eb5e80和0x15eb7940)。 我怀疑您有一个来自接口生成器的对象,然后您创建了另一个标签并将其分配给aboutToDeleteImageTrashCan。 这样,您可能在同一位置上有两个标签,因此删除一个标签将是无懈可击的,因为另一个标签在其下方。 而且由于没有更多(直接)引用来自interface-builder的标签,因此很难使该标签消失。
因此,如果您忽略alloc / init行,我怀疑您的问题将得到解决。
为什么要调用performSelectorOnMainThread:withObject:waitUntilDone :? 这没有任何意义(至少在没有其他上下文的情况下)。 无论如何,您为waituntildone指定了NO,因此这意味着该工作计划在运行循环结束时完成,到那时您已经将aboutToDeleteImageTrashCan设置为nil。
如果由于某种原因您真的想使此removeFromSuperView发生在运行循环的末尾,只需将其分派到主队列即可:
dispatch_async(dispatch_get_main_queue(), ^{
[aboutToDeleteImageTrashCan removeFromSuperview];
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.