搜索后,自定义UITableViewCell视图为空

时间:2014-04-30 21:46:07

标签: ios objective-c uitableview uisearchdisplaycontroller

我相信这个问题是我的确切问题,但是我无法解决接受答案的问题。 UISearchBar: FilterContentForSearchText not working on a UITableView (results not shown on table)

我有UITableViewController允许搜索。它通过默认的UITableViewCellStyle完美地工作,然后我决定为单元格实现我自己的自定义布局。我没有子类UITableViewCell,而是通过Interface Builder向单元格添加了两个UILabel并设置了自动布局。我为他们分配了唯一标记,以便我可以在cellForRowAtIndexPath:中引用这些标签。它工作得很好 - 一切都按预期显示,直到你搜索。搜索确实有效,它显示部分和行,但行上的标签没有文本,因此单元格显示为完全空白。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"List View Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    UILabel *leftLabel = (UILabel *)[cell viewWithTag:100];
    UILabel *rightLabel = (UILabel *)[cell viewWithTag:101];

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        leftLabel.text = ...;
        rightLabel.text = ...;
    }
    else {
        leftLabel.text = ...;
        rightLabel.text = ...;
    }
    return cell;
}

我知道为什么标签是空白的。当您搜索时,dequeueReusableCellWithIdentifier:会返回nil,因此它会返回具有重用标识符的新单元格,但该单元格没有viewWithTag:,这会导致左右标签变为{{1 }}。所以它显然无法向nil添加文字。

链接中提供的答案表明您应在nil语句中创建标签,然后致电if (!cell)。我做到了,然后将我的标签配置代码移动到if语句中。但是当我这样做时,主表的行只有Storyboard中左右标签的默认值 - 它不会设置标签的文本。这是因为[cell.contentView addSubview:left{right}Label];不返回dequeueReusableCellWithIdentifier:而是创建一个新单元格,因此它不会设置文本,因为它位于nil语句中。

我无法弄清楚如何处理这两种情况:当细胞是零而不是细胞时。我需要做些什么来解决这个问题?

更多评论:我之前从未使用过xib文件,我宁愿保持这种状态。 :)如果这是一个解决方案,我不介意继承if (!cell)。当然,我想以“正确”的方式实现这一点 - 只在需要时创建一个单元格等。

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是,如果要对主表和搜索结果表使用相同的单元格类型,请将单元格设置为xib文件。如果需要,您可以创建一个子类(您只需要将IBOutlets放入.h文件中的两个标签),或者使用与使用标签相同的方式。在表视图控制器的viewDidLoad中,为两个表注册nib,

[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"CommonCell" bundle:nil] forCellReuseIdentifier:@"CommonCell"];
[self.tableView registerNib:[UINib nibWithNibName:@"CommonCell" bundle:nil] forCellReuseIdentifier:@"CommonCell"];

然后在cellForRowAtIndexPath:中,您只需要使用相同的标识符对单元格进行出列,并填充标签。没有必要检查单元格是否等于零,因为它永远不会。

我修改了我的一个应用程序,以展示如何实现cellForRowAtIndexPath。我将单元格子类化(CommonCell是类),只将IBOutlets添加到leftLabel和rightLabel,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    CommonCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CommonCell" forIndexPath:indexPath];
    cell.leftLabel.text = ([tableView isEqual:self.tableView])? self.theData[indexPath.row] : self.filteredData[indexPath.row];
    cell.rightLabel.text = ([tableView isEqual:self.tableView])? self.theData[indexPath.row] : self.filteredData[indexPath.row];
    return cell;
}

答案 1 :(得分:2)

这在概念上是错误的:您从代码中实例化一个新CELL,而不是来自界面构建器的单元格。如果要在接口构建器上使用它,则需要为tableView注册nib,并将其与标识符关联(在接口构建器的单元格中也是相同的标识符):

[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"NameNib" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Identifier"];

但问题是:为什么?最好的办法是创建一个子类并添加标签。这很简单:

1)创建一个扩展UITableViewCell的新文件 CustomSearchCell 对象:

<强> CustomSearchCell.h

#import <UIKit/UIKit.h>

@interface CustomSearchCell : UITableViewCell

@property (strong, nonatomic) UILabel *leftLabel;
@property (strong, nonatomic) UILabel *rightLabel;

@end

<强> CustomSearchCell.m

#import "CustomSearchCell.h"

@implementation CustomSearchCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        _leftLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 200, 45)];
        [_leftLabel setFont:[UIFont systemFontOfSize:20.0]];
        [_leftLabel setTextColor:[UIColor blackColor]];

        _rightLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 45, 200, 25)];
        [_rightLabel setFont:[UIFont systemFontOfSize:15.0]];
        [_rightLabel setTextColor:[UIColor grayColor]];

        [self.contentView addSubview: _leftLabel];
        [self.contentView addSubview: _rightLabel];
    }
    return self;
}

@end

2)在视图控制器中:

#import "CustomSearchCell.h"

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"ListCellIdentifier";
    CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[CustomSearchCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.leftLabel = ...;
        cell.rightLabel = ...;
    }
    else {
        cell.leftLabel = ...;
        cell.rightLabel = ...;
    }

    return cell;
}