iOS 5搜索显示控制器并重用UITableViewController

时间:2012-06-02 17:09:13

标签: ios uitableview uisearchbar uistoryboard

背景

我有一个iPhone应用程序,通过在每次使用时再次进行子类化,在几个地方使用UITableViewController子类。其中一个用途是搜索控制器。

@interface TableViewController : UITableViewController
// ...
@interface SearchTableViewController : TableViewController <UISearchDisplayDelegate, UISearchBarDelegate>

在storyboard编辑器中,我在每个使用TableViewController的视图中都有相同的表视图,单元格结构和重用标识符。在我使用它的任何地方,故事板根据我的设计时原型为我生成单元格,以便在tableView:cellForRowAtIndexPath:方法中我不必包含if (cell == nil)部分。

问题

我做错了什么,我的搜索控制器的单元格不是像其他人一样由故事板生成的。起初,我在if (cell == nil)位中添加了解决问题但它会导致我的搜索显示空白行。实际上,搜索显示正确的空白行数。取消搜索后,结果将显示在背景之外。以下是TableViewController的代码:

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

    ModelObject* obj = [self.dataSource modelAtIndex:indexPath.row];
    UILabel* name = (UILabel*) [cell viewWithTag:1];
    name.text = obj.name;
    return cell;
}

我怀疑可能还有其他细节需要确定问题,但任何有关可能导致此问题的提示都会有所帮助。感谢。

2 个答案:

答案 0 :(得分:1)

如果您使用的是Storyboard,请选择“带搜索显示控制器的搜索栏”对象并将其放在视图控制器中(假设为VC)。然后Xcode会自动将搜索栏链接到驻留在VC中的搜索显示控制器。 因此,在VC中,您可以通过self.searchDisplayController访问搜索显示控制器 你的VC应该采用UISearchBarDelegate, UISearchDisplayDelegate之类的协议 您的搜索栏也可以通过self.searchDisplayController.searchBar

访问

在UISearchDisplayDelegate协议中实现相关方法(表视图等)。答对了!您的搜索结果将自动显示。

答案 1 :(得分:1)

&#34; tableview&#34;的一部分是错的。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

您应该使用self.tableview(或链接到tableview的IBOutlet变量名称)。像这样;

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

cellForRowAtIndexPath中的tableview参数不会是搜索完成时viewcontroller中的tableview参数。这就是问题的原因。