iphone - 如何设置 TableView 单元格附件 View 以保留先前初始化的 UIImageView?

标签 iphone uitableview uiimageview

假设我的 View Controller 中有一个属性,定义如下:

@property (nonatomic, retain) UIImageView *checkmarkOffAccessoryView;

我在实现中@synthesize这个,在-dealloc释放它并在-viewDidLoad中初始化它如下:

self.checkmarkOffAccessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];

到目前为止一切顺利。

当我在 TableView 委托(delegate)中使用它作为多个单元格的附件 View 时,会发生两件事:

  1. 只有一个单元格的附件 View 显示图像
  2. 应用程序 UI 卡住。

据我所知,应用程序并没有崩溃,用户界面只是变得没有响应。这在模拟器和设备上都是如此。

以下是我如何在单元格中使用初始化属性:

- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // initialize or dequeue cell...

    if (condition)
        cell.accessoryView = self.checkmarkOffAccessoryView;
    else
        cell.accessoryView = nil;
}

使用上述代码,只有一个单元格显示附件 View ,并且 UI 卡住。

如果我直接在委托(delegate)方法中初始化 UIImageView 实例,我会得到显示附件 View 的所有满足条件的单元格,并且我不会遇到 UI 卡住:

- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // initialize or dequeue cell...

    if (condition)
        cell.accessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
    else
        cell.accessoryView = nil;
}

我的目标是初始化尽可能少的对象并重用一个 UIImageView。我很好奇为什么第一 block 代码有问题以及我可以做些什么来解决这个问题。

似乎单元格的 accessoryView 属性应该只增加 self.checkmarkOffAccessoryViewretain 计数,但似乎我缺少一些细节。

我忽略了什么?感谢您的建议。

编辑

我认为:

self.checkmarkOffAccessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];

等同于:

UIImageView *uncheckedView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]];
self.checkmarkOffAccessoryView = uncheckedView;
[uncheckedView release];

无论哪种方式,我都会遇到同样的卡住症状。

最佳答案

您不能多次添加相同的 View 。 UI 处理程序将会变得疯狂。为了确保这一点,我尝试按照您上面所说的操作,但遇到了同样的问题。 UI 卡住,图像仅出现在其中一个单元格中。

您能做的最好的事情是将图像存储为分配的 UIImage,并有一个帮助函数为每个单元格返回一个新的 UIImageView。

使用您当前的方法(没有存储的 UIImage),您可能会这样做:

-(UIImageView *) makeCheckmarkOffAccessoryView
{
    return [[[UIImageView alloc] initWithImage:
        [UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
}

然后做

cell.accessoryView = [self makeCheckmarkOffAccessoryView];

您可能知道,另一方面,UIImage 可以使用任意多次。 UIImageView 不会占用太多空间,因此您可以轻松拥有一堆,而不必担心。

为了扩展仅一处的交易,想象一下您同时将 UIView 添加到两个地方。

[ob removeFromSuperview] 会对此对象执行什么操作?它会消除两个地方的 View 吗?仅来自其中之一?请求[ob superview]时会返回哪个值?显然,用户界面并不是为了处理您所要求的内容而设计的。

关于iphone - 如何设置 TableView 单元格附件 View 以保留先前初始化的 UIImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3190675/

相关文章:

ios - 动态改变UIImage宽度

iPhone iOS 保存从 UIImageJPEGRepresentation() 获取的数据第二次失败 : ImageIO: CGImageRead_mapData 'open' failed

iphone - iOS:使用父类(super class)的 getter 和 setter 的属性不再适用于 Xcode 4.4

iphone - FBConnect: "The user hasn' t 授权应用程序执行此操作”

ios - 无法更改 UIImageView 图像

iphone - 如何实现代码以实时更新显示的 UIImageView?

iphone - 什么是 MKTeleportingUserLocation?

ios - tableView 上显示的奇怪标签

ios - 如何使用 NSCoding 在我的应用程序中保存/加载数据?

ios - 如何测试自定义单元格是否已在 tableView 中注册?