Objective c UISearchDisplayController的搜索结果具有与搜索表不同的单元格布局和行为

Objective c UISearchDisplayController的搜索结果具有与搜索表不同的单元格布局和行为,objective-c,ios,cocoa-touch,uitableview,uistoryboard,Objective C,Ios,Cocoa Touch,Uitableview,Uistoryboard,我正在使用故事板。我有一个带有一个原型单元的UITableView。此单元格采用“字幕”样式。我已经在详细视图中添加了一个单元格的分段。因此,当用户点击一个单元格时,它将打开相应的编辑器。。。这一切都很好 现在我添加了一个UISearchDisplayController和一个UISearchBar,实现了委托。这很有效 但在搜索结果表中,单元格的样式为“默认”,不可点击。要使结果表的外观和行为与“未搜索”表类似,我必须做些什么?对此有一个可能的答案。它可能不完全适用于您,但正如我所解释的,UI

我正在使用故事板。我有一个带有一个原型单元的UITableView。此单元格采用“字幕”样式。我已经在详细视图中添加了一个单元格的分段。因此,当用户点击一个单元格时,它将打开相应的编辑器。。。这一切都很好

现在我添加了一个UISearchDisplayController和一个UISearchBar,实现了委托。这很有效


但在搜索结果表中,单元格的样式为“默认”,不可点击。要使结果表的外观和行为与“未搜索”表类似,我必须做些什么?

对此有一个可能的答案。它可能不完全适用于您,但正如我所解释的,UISearchDisplayController创建了表视图

查看文档,您可以更好地了解它,但它指出:

您可以使用搜索栏和 负责管理要删除的原始内容的视图控制器 搜索。当用户开始搜索时,搜索显示控制器 负责将搜索界面叠加到 原始视图控制器的视图并显示搜索结果。这个 结果显示在搜索创建的表视图中 显示控制器。除了原始视图控制器外,还有 逻辑上还有四个角色。这些通常都是由 同一对象,通常是原始视图控制器本身

发现了问题

方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
从tableView中提取单元格,在结果案例中,tableView不是来自故事板的tableView,而是来自SearchDisplayController的ResultableView


我现在从故事板中的表格视图中获得两种情况下的单元格显示,现在它可以工作了。

我想为答案#1做出贡献。这就是我所做的,它为我工作

在方法中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
而不是从参数tableView中指定单元格

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
直接从视图上的TableView分配它,因此您必须替换它

// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
用这个

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

在我的例子中,UISearchDisplayController使用了正确的单元格类型(自定义),但单元格高度错误,所以我不得不使用

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

方法来修复它。

我一直在使用ios 7.0和Xcode 5.0。我发现搜索显示控制器使用与代理视图控制器相同的tableview布局。您所要做的就是判断当前tableview是代理视图控制器的tableview,还是搜索显示控制器的tableview。但是记住要加上这个句子

tableView.rowHeight = self.tableView.rowHeight;
在以下代码段中:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
if (tableView == self.searchDisplayController.searchResultsTableView)
{
    tableView.rowHeight = self.tableView.rowHeight;//very important!
    return [self.searchResults count];
}
else
{
    ...
    return ...;
}
}

如果忘记实现该语句,则搜索显示的表视图的行仅与默认行一样高,这使您认为它不像“未搜索”的表。

原因是UISearchDisplayController创建了自己的UITableView,因此,这是用默认单元格创建的。谢谢你的回答。我调试了我的代码,是的,调用了datasource方法。正确的单元格也会从情节提要中提取并填充正确的数据,但结果表会显示默认的表格单元格样式。。。我不明白为什么…嗨,新谷-你介意解释或显示你的代码来解决这个问题吗?我的视图不是一个简单的表视图。我需要一个背景图像,所以tableview被嵌入到uiview中。视图控制器有一个到表视图的出口。当调用CellForRowatineXpath时,我现在从tableView出口获取单元格,因此单元格总是从interface builder中自定义的tableView派生。这对我很有帮助。由于所有原型单元都位于“正常/原始”表视图上,而不是“搜索”表视图上,因此使用self是一个很好的技巧。而不是传递给tableview的参数!