如何在objective-c中使用新图像删除uibutton的旧图像

时间:2011-04-13 13:27:04

标签: objective-c cocoa-touch uiimage uibutton

我在编码时遇到了一个问题,就是这样。我使用带有循环的自定义按钮在视图中显示了20个图像。一段时间后,我正在用新图像更改按钮图像。但是这里发生的事情是旧图像显示在当前图像的背面。

for(currentRow = 0; currentRow < 5; currentRow++)
    {
        for (currentColumn = 0 ; currentColumn < 4; currentColumn++)
        {
            if(indexValue<20)
            {
                printf("\n index value %d",indexValue);
                A *aObject = [aList objectAtIndex:indexValue];

                MyCustomButton *myButton = [[MyCustomButton alloc] initWithIdValue:aObject.aName];
                CGRect imageFrame = CGRectMake(currentColumn * 80+5, currentRow * 80+5, 67, 67);
                [myButton setImage:[UIImage imageNamed:aObject.aName] forState:UIControlStateNormal];
                [myButton setFrame:imageFrame];
                myButton.backgroundColor=[UIColor clearColor];
                [myButton addTarget:self  action:@selector(aAction:) forControlEvents:UIControlEventTouchUpInside];
                [myView addSubview:myButton];
                [myButton release];
                 myButton = nil;
}
}
}

帮助我解决这个问题,

谢谢你, Madan Mohan。

2 个答案:

答案 0 :(得分:1)

正如onnoweb已经提到的: 每次要更改图像时都不应添加新按钮。 我选择的方法是,在视图的viewDidLoad中创建所需的所有按钮并将其添加到那里。 例如:(伪代码)

- (void)viewDidLoad
{
    for(int i = 0; i < columnCount; i++)
    {
        for(int j = 0; j < rowCount; j++)
        {

            MyCustomButton *myButton = [[MyCustomButton alloc] initWithIdValue:aObject.aName];
            CGRect imageFrame = CGRectMake(currentColumn * 80+5, currentRow * 80+5, 67, 67);
            forState:UIControlStateNormal];
            [myButton setFrame:imageFrame];
            myButton.backgroundColor=[UIColor clearColor];
            [myButton addTarget:self  action:@selector(aAction:) forControlEvents:UIControlEventTouchUpInside];
            [myView addSubview:myButton];
            [myButton release];
            myButton = nil;
        }
    }
}

然后您可以使用以下行更改循环中的图像:(伪代码)

            myButton = buttonMatrix[row][column];
            [myButton setImage:[UIImage imageNamed:aObject.aName] forState:UIControlStateNormal];

与不总是创建新按钮而不释放旧按钮相比,这还要少得多。

答案 1 :(得分:0)

您有两种方法可以解决此问题:

1)保存你在循环中创建的按钮指针,在更新图像时,使用按钮指针调用setImage:forState:再次,这将用新图像替换按钮中的旧图像。并保存按钮的初始化/销毁时间。

2)将按钮指针保存为步骤1),调用[button removeFromSuperView]按钮从超级视图中删除该按钮,然后重新创建一个新按钮并再次插入超级视图。这是不推荐的方式,因为旧按钮将被销毁并且新按钮将被初始化,这些操作都会降低性能(时间),如果在按钮顶部添加了一些其他子视图,则在创建新按钮之后,你需要让按钮顶部的所有视图再次位于顶部。因此,如果您没有任何具体原因需要重新创建新按钮,请按照步骤1)进行操作,这很简单快捷。