UISearchDisplayController无法正确显示自定义单元格

时间:2013-04-09 03:12:55

标签: iphone ios objective-c uitableview uisearchdisplaycontroller

所以我有一个包含节和行的tableView,它使用自定义单元类。自定义单元格具有图像视图和一些标签。表视图工作正常,搜索工作,但搜索不显示我的自定义单元格类中的任何标签,只显示具有正确图像的imageView。我很困惑为什么会这样,特别是因为图像仍然显示,但不是标签。这是一些代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


//TODO: problem with search view controller not displaying labels for the cell, needs fixing
JSBookCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

if(cell == nil) {
    cell = [[JSBookCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

JSBook *book = nil;
//uses the appropriate array to pull the data from if a search has been performed
if(tableView == self.searchDisplayController.searchResultsTableView) {
    book = self.filteredTableData[(NSUInteger)indexPath.section][(NSUInteger)indexPath.row];
}
else {
    book = self.books[(NSUInteger)indexPath.section][(NSUInteger)indexPath.row];
}

FFMetaData *data = [self.ff metaDataForObj:book];
cell.titleLabel.text = book.title;
cell.priceLabel.text = [NSString stringWithFormat:@"$%@", book.price];
cell.authorLabel.text = book.author;
cell.descriptionLabel.text = book.description;

cell.dateLabel.text = [self.formatter stringFromDate:data.createdAt];
if(book.thumbnail == nil) {
    cell.imageView.image = [UIImage imageNamed:@"messages.png"];
    [self setCellImage:cell withBook:book atIndex:indexPath withTableView:tableView];
}
else {
    cell.imageView.image = [UIImage imageWithData:book.thumbnail];
}

return cell;

}

在此问题出现之前,我在tableView中只有一个部分,一切都运行良好。现在我有多个部分和行,搜索按照我的描述被破坏了。有任何想法吗?另外,对于[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];,我曾经有[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];但是现在如果我使用它,当我尝试搜索时会得到一个奇怪的例外:

NSInternalInconsistencyException',原因:'请求无效索引路径处的rect(2个索引[1,1])'

这也让我感到困惑。谢谢你的帮助!

6 个答案:

答案 0 :(得分:30)

[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

不起作用,因为表视图单元格已注册到特定的表视图。这不适用于您的搜索结果控制器表视图。你确实找到了这个并切换到:

[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

这是正确的做法。

此外,在故事板中设计自定义单元格对于搜索结果控制器不起作用,因为您无法为主表视图设计搜索表视图的单元格。

是的,您可以像在此处一样为搜索表视图注册该类

[self.searchDisplayController.searchResultsTableView registerClass:[JSBookCell class] forCellReuseIdentifier:CellIdentifier];

但是,这不会包含您在故事板中自定义单元格中设计的任何内容。您必须以编程方式创建所有内容。

答案 1 :(得分:24)

当我尝试搜索时遇到了同样的异常以及一些如何修复它。

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    }else{
       cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];     
    }

答案 2 :(得分:9)

我使用在故事板原型中设计的相同自定义单元格的UITableView与搜索栏和搜索显示的摘要:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellIdentifierAsYouDefinedInStoryboard";

    CustomTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        /* searchResultsTableView code here */
    } else {
        /* Base tableView table code here */
    }

    /* more cell code here */

    return cell;
}


然后为searchResultsTableView添加此行以匹配您的自定义单元格高度:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.searchDisplayController.searchResultsTableView setRowHeight:self.tableView.rowHeight];

     /* more of your viewDidLoad code */
}

答案 3 :(得分:6)

如果您在UIViewController中使用UITableView并且想要重新使用在StoryBoard中为searchDisplayController创建的单元标识符,请尝试以下操作:

StoryBoard> UIViewController>参考插座>将tableView链接到你的UIViewController的.h文件并调用类似tableView的东西,所以你应该有这样的东西:

@property (strong, nonatomic) IBOutlet UITableView *tableView;

所以不要这样做:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]
}

这样做

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]
}

答案 4 :(得分:0)

如果在故事板中创建一个单元格,则不应该注册该类(这实际上会搞砸了)。如果在代码中创建单元格,则注册该类,如果在nib中创建单元格,则注册一个nib。如果你在故事板中创建它,你没有注册任何东西,你使用dequeueReusableCellWithIdentifier:forIndexPath:,你根本不需要if(cell == nil)子句。

答案 5 :(得分:0)

试试这个,这对我有用

JSBookCell * cell = [yourtableview dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];