假设我的 View Controller 中有一个属性,定义如下:
@property (nonatomic, retain) UIImageView *checkmarkOffAccessoryView;
我在实现中@synthesize
这个,在-dealloc
中释放
它并在-viewDidLoad
中初始化它如下:
self.checkmarkOffAccessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
到目前为止一切顺利。
当我在 TableView 委托(delegate)中使用它作为多个单元格的附件 View 时,会发生两件事:
- 只有一个单元格的附件 View 显示图像
- 应用程序 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.checkmarkOffAccessoryView
的 retain
计数,但似乎我缺少一些细节。
我忽略了什么?感谢您的建议。
编辑
我认为:
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/