如何使用自定义单元格视图类与搜索栏?

时间:2014-02-05 11:11:21

标签: ios iphone objective-c ios7

我正在使用我的视图控制器的搜索栏和显示控制器。当我使用默认UITableViewCell时,一切正常。但是,当我使用自定义单元格与控制器。它不会在拖动的标签上显示文字。

此代码工作正常 -

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

{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"userName"];
    }

    return cell;
}

现在我已经为该原型单元分配了一个名为SearchFriendCell和标识符SearchFriends的类。 SearchFriendCell类包含带插座的标签。 现在如果我用以下代码替换上面的代码,它不会显示任何结果。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"SearchFriends";
    SearchFriendCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.friendName.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"userName"];// this line doesn't work
    }

    return cell;
}

在修改后的代码中,如果我用以下行替换注释行,则显示结果 -

cell.textLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"userName"];

我不知道这里有什么问题。搜索栏显示控制器无法识别我的原型单元格。在此之前我已多次使用表视图控制器,但我没有遇到这种类型的问题。 帮帮我一些好的答案。

3 个答案:

答案 0 :(得分:4)

当您调用

时,您的原型单元格会在您的tableview中注册,但会在搜索栏结果表视图中注册
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"SearchFriends";
    SearchFriendCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

您正在使用参数tableView,它可以是搜索栏结果tableview,它没有自定义原型的注册表。所以只需改为

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

你可能不再需要了

if (cell == nil) { ... }

最好的问候, JL

答案 1 :(得分:2)

您的手机未正确注册。您说您有一个具有正确标识符的原型单元格,但在代码中您没有看到正在创建的单元格的实例。这意味着您的代码将运行:

cell = [[SearchFriendCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

不会创建所有子视图或连接任何商店。

您需要找出您的手机未正确注册的原因。如果您在故事板中创建它,那么它应该包含在将要使用它的表视图中(它应该自动注册单元格)。如果您在独立的XIB文件中创建它,那么您需要加载NIB并在加载表视图时显式注册它。


您有2个表视图,单元格注册了一个而不是另一个 - 这是原型单元的工作方式。

您最好的选择:

  1. 删除原型单元格,创建XIB并明确向每个表格视图注册NIB
  2. 不使用搜索控制器(因此您只有1个表视图,自己管理搜索栏)

答案 2 :(得分:0)

您需要创建插座并将其与表格视图相结合

@property (weak, nonatomic) IBOutlet UITableView *myTableView;

而不是使用

SearchFriendCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

使用

SearchFriendCell *cell = [self.myTableView dequeueReusableCellWithIdentifier:CellIdentifier];