如何正确添加/删除单元格右侧(附件视图)上的按钮?
如何向每个单元格添加目录检查条件,然后显示两种类型的单元格之一?
就我而言:ViewWillAppear使用目录名称下载XML并将其加载到TableView。每个单元格都在检查手机上是否存在该目录。如果确实如此,则单元格没有按钮(关闭),如果没有,则单元格获得按钮(打开)。 ImageViews也不同。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [uitableview dequeueReusableCellWithIdentifier:CellIdentifier];
SomeClass *k = (SomeClass*)[self.arr_SomeClass objectAtIndex:indexPath.row];
NSString *checkThisDir = [documents_dir stringByAppendingPathComponent:[k.dir_name stringByDeletingPathExtension]];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
cell.imageView.tag = 121;
cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
if (![[NSFileManager defaultManager] fileExistsAtPath:dir_name isDirectory:nil]) {
cell.imageView.image = [UIImage imageNamed:@"icon_on.png"];
UIButton *bt = [UIButton buttonWithType:UIButtonTypeRoundedRect];
bt.contentMode = UIViewContentModeScaleAspectFit;
bt.tag = 123;
UIImage *imgDownload = [UIImage imageNamed:@"icon_button.png"];
[bt setImage:imgDownload forState:UIControlStateNormal];
[bt setImage:imgDownload forState:UIControlStateHighlighted];
[bt setImageEdgeInsets:UIEdgeInsetsMake(4,3,2,3)];
[bt setFrame:CGRectMake(282,5,34,34)];
[bt addTarget:self action:@selector(listButtonClick:event:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:bt];
UIView *empty = [UIView new]; // makes space for button
cell.accessoryView = empty;
[empty release];
}
else {
// or: cell.imageView.image = [UIImage imageNamed:@"icon_off.png"];
UIButton *bt = (UIButton*)[cell viewWithTag:123];
[bt removeFromSuperview];
UIImageView *iv = (UIImageView*)[cell viewWithTag:121];
iv.image = [UIImage imageNamed:@"icon_off.png"];
}
cell.detailTextLabel.text = k.details;
cell.textLabel.text = k.name;
return cell;
}
listButtonClicked
只需下载文件并创建目录,然后在TableView上执行reloadData
和reloadRowsAtIndexPaths
。
问题是,当我将列表滚动到足够高或低时,有时会有一些按钮被添加到不应该有它们的单元格中。
任何帮助都会很好,提前谢谢!
解决:
将按钮创建移至if (cell==nil) { .. }
并在外面添加:
UIButton *bt = (UIButton*)[cell viewWithTag:123];
if (![[NSFileManager defaultManager] fileExistsAtPath:albumDir isDirectory:nil]) {
cell.imageView.image = [UIImage imageNamed:@"icon_on.png"];
[bt setHidden:NO];
}
else {
cell.imageView.image = [UIImage imageNamed:@"icon_off.png"];
[bt setHidden:YES];
}
答案 0 :(得分:2)
发生这种情况是因为你要从表中出列单元格(这很好!),这样每次需要新单元格时iOS都不会重新创建它们。一旦单元格出列,它将带入您之前添加到其中的所有子视图(例如,用于另一行)。为了使整个工作正常,一旦你将一个单元格出列,你应该清理它的所有内容然后按你的意愿渲染它。
否则,更好的方法可能是在if (cell == nil)
块中创建一个单元格,自动添加图像和按钮的视图,而不设置图像。传递该块后,您将使用标记([cell viewWithTag:121]
)和按钮([cell viewWithTag:123]
)获取图像,并将其设置为隐藏。从现在开始,您可以根据需要开始定义单元格。
这样,每次你请求一个单元格时,它都会有一个默认的图像和按钮,但是会隐藏,之后根据你的需要将它们设置为可见。
这应该可以解决您的问题。如果有帮助,请告诉我。