我有一个 UITableView
与 searchBar
和 searchDisplayController
.我想做的是展示一个button
当没有找到结果时。所以用户可以搜索服务器的数据库。我有一个 NSMutableArray
存储searchResults
.所以我的委托(delegate)方法如下所示:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"titulo contains [cd] %@", searchText];
NSArray *filtroUsuario = [self.objects filteredArrayUsingPredicate:predicate];
self.searchResults = [[NSMutableArray alloc] initWithArray:filtroUsuario];
if (self.searchResults.count < 1) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 320, 50);
btn.showsTouchWhenHighlighted = YES;
[btn setTitle:@"Procurar no Banco de Dados" forState:UIControlStateNormal];
btn.tag = 1;
[self.searchResults addObject:btn];
self.adicionar = YES;
}
}
基本上,当没有结果时,我创建并添加一个
button
我的结果array
.然后,在 cellForRowAtIndexPath
,我有以下内容:if (tableView == self.searchDisplayController.searchResultsTableView) {
if (self.adicionar == YES) {
cell.textLabel.text = @"";
[cell.contentView addSubview:self.searchResults[indexPath.row]];
self.adicionar = NO;
}
这显示了
button
正是我想要的方式,当cancelButton
被按下,或 button
有问题,我只是将其从 searchResults
中删除以防用户再次搜索。 [self.searchResults removeAllObjects]
.问题是,由于我正在重用单元格,
subview
当用户再次搜索时,它仍然存在。我有几个选项来处理这个问题,我可以为单元格创建一个属性并在 button
时删除 subview 。被按下。但我选择包含 [[cell.contentView viewWithTag:1] removeFromSuperview];
行cellForRowAtIndexPath
的开头,所以当它再次被调用时,它会删除 subViews
在继续之前。现在一切正常。我的问题是这是否是最好的方法,或者是否有更简单的方法。由于我的应用程序是一个复杂的应用程序,我非常关心内存和性能,此外,我真的很想学习可用的最酷的技术。
有什么想法吗?
最佳答案
看看 UITableViewCell 上的 -prepareForReuse。可能最适合您描述的确切情况。 (下面的草图示例)
@interface CustomCellName : UITableViewCell
@property (strong, nonatomic) UIButton *someButton;
@end
@implementation
- (void)prepareForReuse
{
_someButton.hidden = YES;
//etc...
}
@end
标签也非常好,尽管许多人发现这种方法并不令人满意。 (*需要引用)
另一种方法是使用 UIButton 子类化 UITableViewCell 作为属性,您可以通过 -cellForRowAtIndexPath 从 tableView 调整该属性。
关于ios - 何时从 UITableViewCell 中删除 subview ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22327511/