removeFromSuperView无法处理按钮

时间:2014-07-01 19:21:25

标签: ios xcode uibutton

另一个问题我正在打扰。 我以编程方式创建了一个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;

你们有什么想法吗?

3 个答案:

答案 0 :(得分:2)

当您将此语句的输出放在包含' performSelectorOnMainThread'的行之前时,是否可以显示该语句的输出?打电话:

NSLog(aboutToDeleteImageTrashCan: %@, aboutToDeleteImageTrashCan);

答案 1 :(得分:1)

是的,看到他们有不同的内存地址? (0x15eb5e80和0x15eb7940)。我怀疑你有一个对象来自界面构建器,然后你创建另一个标签并将其分配给aboutToDeleteImageTrashCan。这样,您可能在同一个地方有两个标签,因此删除一个标签将是不可见的,因为另一个标签位于其下方。而且由于你没有(直接)引用interface-builder中的标签,因此很难让它消失。

因此,如果省略alloc / init行,我怀疑你的问题将会解决。

答案 2 :(得分:0)

为什么要调用performSelectorOnMainThread:withObject:waitUntilDone:?这没有任何意义(至少没有其他背景)。 无论如何,你为waituntildone指定NO,所以这意味着这项工作计划在runloop结束时完成,到那时你已经将aboutToDeleteImageTrashCan设置为nil。

如果由于某种原因你真的想让这个removeFromSuperView发生在runloop的末尾,只需将它发送到mainqueue:

dispatch_async(dispatch_get_main_queue(), ^{
    [aboutToDeleteImageTrashCan removeFromSuperview];
});