如何在Objective-C中用新图像删除uibutton的旧图像

如何解决如何在Objective-C中用新图像删除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)。     

解决方法

正如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)保存在循环中创建的按钮指针,更新图像时,再次使用按钮指针调用setImage:forState:,这会将按钮中的旧图像替换为新图像。并且可以保存按钮的初始化/销毁时间。 2)保存步骤1)中的按钮指针,调用[button removeFromSuperView]从超级视图中删除按钮,然后重新创建一个新按钮并再次插入到超级视图中。不建议使用这种方法,因为在创建新按钮之后,旧按钮将被销毁,新按钮将被初始化,这两个操作都将花费性能(时间),并且如果在按钮顶部添加了一些其他子视图, ,您需要将所有视图置于按钮顶部,然后再次置于顶部。因此,如果没有任何特定原因需要重新创建一个新按钮,只需按照步骤1)进行操作即可,它既简单又快速。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?