繁体   English   中英

何时从UITableViewCell中删除子视图?

[英]When to remove subview from UITableViewCell?

我有一个带有searchBarsearchDisplayControllerUITableView 我想要做的是在没有找到结果时显示一个button 因此用户可以搜索服务器的数据库。 我有一个NSMutableArray来存储searchResults 所以我的委托方法看起来像这样:

- (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;
    }
}

基本上,当没有结果时,我创建并向结果array添加一个button 然后,在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时删除子视图。 但我选择包含行[[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进行调整。

Best是一个灵活的术语 - 在哪方面最好......

你有什么工作,但这不是一个很好的责任分配。 最好创建一个自定义单元子类,并让它提供一个可以添加自定义按钮的API。 单元子类将处理prepareForReuse按钮的清理。

从记忆和性能的角度来看,差别不大。 但是使用细胞亚类更正确。

为了提高性能,最好不要创建和销毁按钮实例。 因此,对于您的单元子类来说,最好创建一个按钮,但在需要之前将其隐藏,然后显示它。 现在, prepareForReuse只会隐藏按钮。 通常这会平均使用更多的内存 - 这是一个折衷...

首先,将控件与您的应用数据混合不是一个好习惯。 您可以使它按现有的方式工作,但从长远来看,它可以将UI与应用程序数据分开。 表视图应该完成呈现操作数据的数据和控件的所有工作,因此最好在结果数组中添加字符串“No Data”,然后在cellForRowAtIndexPath中处理它。 在您的单元格上创建一个按钮,只需在需要时隐藏/显示它。 不要担心内存消耗,单元格是可重用的,因此您将拥有非常少量的按钮(隐藏的按钮)。

第二件事,如果你真的不打算只创建一个按钮然后标记它,例如,当你决定需要它时创建它并标记为1000.然后当你重新加载但不想显示它时,只要问你的单元格如果它有一个标签== 1000的视图并从superview中删除它。 但是,如果你为每个可见细胞创建一个按钮,那么它就是一种矫枉过正,你的记忆完整性也不会受到威胁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM