我相信这个问题是我的确切问题,但是我无法解决接受答案的问题。 UISearchBar: FilterContentForSearchText not working on a UITableView (results not shown on table)
我有UITableViewController
允许搜索。它通过默认的UITableViewCellStyle
完美地工作,然后我决定为单元格实现我自己的自定义布局。我没有子类UITableViewCell
,而是通过Interface Builder向单元格添加了两个UILabel
并设置了自动布局。我为他们分配了唯一标记,以便我可以在cellForRowAtIndexPath:
中引用这些标签。它工作得很好 - 一切都按预期显示,直到你搜索。搜索确实有效,它显示部分和行,但行上的标签没有文本,因此单元格显示为完全空白。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"List View Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
UILabel *leftLabel = (UILabel *)[cell viewWithTag:100];
UILabel *rightLabel = (UILabel *)[cell viewWithTag:101];
if (tableView == self.searchDisplayController.searchResultsTableView) {
leftLabel.text = ...;
rightLabel.text = ...;
}
else {
leftLabel.text = ...;
rightLabel.text = ...;
}
return cell;
}
我知道为什么标签是空白的。当您搜索时,dequeueReusableCellWithIdentifier:
会返回nil
,因此它会返回具有重用标识符的新单元格,但该单元格没有viewWithTag:
,这会导致左右标签变为{{1 }}。所以它显然无法向nil
添加文字。
链接中提供的答案表明您应在nil
语句中创建标签,然后致电if (!cell)
。我做到了,然后将我的标签配置代码移动到if语句中。但是当我这样做时,主表的行只有Storyboard中左右标签的默认值 - 它不会设置标签的文本。这是因为[cell.contentView addSubview:left{right}Label];
不返回dequeueReusableCellWithIdentifier:
而是创建一个新单元格,因此它不会设置文本,因为它位于nil
语句中。
我无法弄清楚如何处理这两种情况:当细胞是零而不是细胞时。我需要做些什么来解决这个问题?
更多评论:我之前从未使用过xib文件,我宁愿保持这种状态。 :)如果这是一个解决方案,我不介意继承if (!cell)
。当然,我想以“正确”的方式实现这一点 - 只在需要时创建一个单元格等。
答案 0 :(得分:2)
我认为最简单的方法是,如果要对主表和搜索结果表使用相同的单元格类型,请将单元格设置为xib文件。如果需要,您可以创建一个子类(您只需要将IBOutlets放入.h文件中的两个标签),或者使用与使用标签相同的方式。在表视图控制器的viewDidLoad中,为两个表注册nib,
[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"CommonCell" bundle:nil] forCellReuseIdentifier:@"CommonCell"];
[self.tableView registerNib:[UINib nibWithNibName:@"CommonCell" bundle:nil] forCellReuseIdentifier:@"CommonCell"];
然后在cellForRowAtIndexPath:中,您只需要使用相同的标识符对单元格进行出列,并填充标签。没有必要检查单元格是否等于零,因为它永远不会。
我修改了我的一个应用程序,以展示如何实现cellForRowAtIndexPath。我将单元格子类化(CommonCell是类),只将IBOutlets添加到leftLabel和rightLabel,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
CommonCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CommonCell" forIndexPath:indexPath];
cell.leftLabel.text = ([tableView isEqual:self.tableView])? self.theData[indexPath.row] : self.filteredData[indexPath.row];
cell.rightLabel.text = ([tableView isEqual:self.tableView])? self.theData[indexPath.row] : self.filteredData[indexPath.row];
return cell;
}
答案 1 :(得分:2)
这在概念上是错误的:您从代码中实例化一个新CELL,而不是来自界面构建器的单元格。如果要在接口构建器上使用它,则需要为tableView注册nib,并将其与标识符关联(在接口构建器的单元格中也是相同的标识符):
[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"NameNib" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Identifier"];
但问题是:为什么?最好的办法是创建一个子类并添加标签。这很简单:
1)创建一个扩展UITableViewCell
的新文件 CustomSearchCell 对象:
<强> CustomSearchCell.h 强>
#import <UIKit/UIKit.h>
@interface CustomSearchCell : UITableViewCell
@property (strong, nonatomic) UILabel *leftLabel;
@property (strong, nonatomic) UILabel *rightLabel;
@end
<强> CustomSearchCell.m 强>
#import "CustomSearchCell.h"
@implementation CustomSearchCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
_leftLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 200, 45)];
[_leftLabel setFont:[UIFont systemFontOfSize:20.0]];
[_leftLabel setTextColor:[UIColor blackColor]];
_rightLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 45, 200, 25)];
[_rightLabel setFont:[UIFont systemFontOfSize:15.0]];
[_rightLabel setTextColor:[UIColor grayColor]];
[self.contentView addSubview: _leftLabel];
[self.contentView addSubview: _rightLabel];
}
return self;
}
@end
2)在视图控制器中:
#import "CustomSearchCell.h"
和
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ListCellIdentifier";
CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[CustomSearchCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if (tableView == self.searchDisplayController.searchResultsTableView) {
cell.leftLabel = ...;
cell.rightLabel = ...;
}
else {
cell.leftLabel = ...;
cell.rightLabel = ...;
}
return cell;
}