如何在故事板中使用原型单元与搜索结果控制器

时间:2013-01-07 07:44:34

标签: iphone ios uitableview storyboard uisearchresultscontroller

我在搜索结果控制器中搜索结果控制器tableview得到此错误表示没有单元格并得到以下错误。如何在此方法中创建prototype单元格{{1 }}

代码:

CellForRowAtIndexPath

错误:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
 static NSString *CellIdentifier = @"HoCell";
Ho *cell;
Ho *item;

if (tableView == self.searchDisplayController.searchResultsTableView) {
    if (cell == nil)
    {
        cell = [[Ho alloc]  initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"HoCell"];
    }
    item = [searchResultsController objectAtIndexPath:indexPath];
}
else{
    cell = (Ho*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    item = [fetchedResultsController objectAtIndexPath:indexPath];
}
cell.ho.text = item.name;

cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"se.png"]];

return cell;
}

3 个答案:

答案 0 :(得分:4)

这里可能有两种可能性:

  

1)您返回的数字大于您的数组计数   的tableView:numberOfRowsInSection :.不。

     

2)您的一个或多个单元格#插座没有连接到您的笔尖,或   没有连接到UITableViewCell(或子类)。勾起他们   正常。

浏览 Ray Wenderlich的链接: How to Add Search Into a Table View

选中 SO问题:

1) UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath: Exception

2) ios 5 UISearchDisplayController crash

一个更美丽的链接:Custom Prototype Table Cells and Storyboards只看到部分:

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  UITableViewCell *cell = [tableView
            dequeueReusableCellWithIdentifier:UYLCountryCellIdentifier];
  if (cell == nil)
  {
    [self.countryCellNib instantiateWithOwner:self options:nil];
    cell = self.countryCell;
    self.countryCell = nil;
  }
  // Code omitted to configure the cell...
  return cell;
}

答案 1 :(得分:0)

您的代码似乎有问题。你检查cell == nil,而它最初没有设置为nil。基于搜索模式以这种方式分配单元格看起来有点奇怪。

无论如何,我会采用不同的方式。我这样做的方式几乎是规范的:)只需使用您的搜索结果为每个案例填充您的单元格(搜索模式和正常模式)。在此示例中,searchResult和dataSource是包含字符串的数组。我认为在现实生活中,它会像nsdictionary的数组一样复杂。

在视图控制器中:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)_section
{
        /* Use correct data array so that in search mode we draw cells correctly. */
        NSMutableArray *data = searching ? searchResult : dataSource;
        return [data count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{       
        /* Use correct data array so that in search mode we draw cells correctly. */
        NSMutableArray *data = searching ? searchResult : dataSource;
        static NSString *CellIdentifier = @"CellId";

        CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
                cell = [[[CustomTableViewCell alloc] initWithIdentifier:CellIdentifier] autorelease];
        }

        /* Note this is only correct for the case that you have one section */
        NSString *text = [data objectAtIndex:[indexPath row]]

        cell.textLabel.text = text;
        /* More setup for the cell. */
        return text;
}

以下是搜索控制器和一些助手的委托方法:

- (void) searchTableView
{
        NSString *searchText = searchBar.text;

        for (NSString *item in dataSource) {
                NSRange range = [item rangeOfString:searchText options:NSCaseInsensitiveSearch];
                if (range.length > 0) {
                        [searchResult addObject:item];
                }
        }
}

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
        searching = NO;
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
        searching = NO;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0]
                      withRowAnimation:UITableViewRowAnimationAutomatic];
        [searchResult removeAllObjects];
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchText
{
        [searchResult removeAllObjects];

        if ([searchText length] > 0) {
                searching = YES;
                [self searchTableView];
        } else {
                searching = NO;
        }
        return YES;
}

希望这有帮助。

答案 2 :(得分:0)

我有同样的问题,这是做了什么,它现在正在完美地工作..

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Here is my code BEFORE
    //
    OPUsersTableViewCell *tableCell = [tableView dequeueReusableCellWithIdentifier:TableCellID];

    // Here is my code AFTER
    //
    OPUsersTableViewCell *tableCell = [self.groupTableView dequeueReusableCellWithIdentifier:TableCellID];

注意:

self.groupTableViewprototype cell的所在......