UILabel 在 cellForRowAtIndexPath 中为零

Posted

技术标签:

【中文标题】UILabel 在 cellForRowAtIndexPath 中为零【英文标题】:UILabel is nil in cellForRowAtIndexPath 【发布时间】:2014-08-25 01:15:37 【问题描述】:

我正在使用带有自定义表格单元类的 Storyboard 原型单元,并且在 cellForRowAtIndexPath 中的 UILabel 为 nil。 Xcode 的标识符是正确的,单元格已初始化,默认的 UILabel(即 textLabel 和 detailTextLabel)已初始化,但不是我添加并设置 IBOutlets 的自定义 UILabel。我尝试过的几件事:

我尝试删除 ViewDidLoad 中的 registerClass 调用,但由于单元格需要将其初始化为自定义类 GenericDetailCell,因此崩溃了。

viewWithTag 返回 nil

我尝试遍历 UITableView 的所有子视图,看看我是否得到了错误的单元格。 dequeueReusableCellWithIdentifier 正在返回正确的单元格

有人遇到过这种情况吗?

@implementation PeopleGroupPickerViewController

    NSArray *people;
    NSArray *searchResults;


- (void)viewDidLoad

    [super viewDidLoad];

    people = [[DAL sharedInstance] getPeople:false];
    [self.tableView registerClass:[GenericDetailCell class] forCellReuseIdentifier:@"PersonCell"];
    [self.searchDisplayController.searchResultsTableView registerClass:[GenericDetailCell class] forCellReuseIdentifier:@"PersonCell"];

    // ***.com/questions/5474529
    [self.searchDisplayController setActive:YES];
    [self.searchDisplayController.searchBar becomeFirstResponder];


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    if(tableView == self.searchDisplayController.searchResultsTableView)
    
        return 1;
    
    else
    
        return 1;
    


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    if(tableView == self.searchDisplayController.searchResultsTableView)
    
        return searchResults.count;
    
    else
    
        return people.count;
    



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

    GenericDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PersonCell" forIndexPath:indexPath];

    Person_ *thisPerson;
    if(tableView == self.searchDisplayController.searchResultsTableView)
    
        thisPerson = (Person_ *) searchResults[indexPath.row];
        NSLog(@"searchResultsTableView, %@",thisPerson.sName);
    
    else
    
        thisPerson = (Person_ *) people[indexPath.row];
        NSLog(@"UITableView, %@",thisPerson.sName);
    
    Person_ *thisSpouse = [[DAL sharedInstance] getSpouse:thisPerson People:people];

    // cell.fieldName and cell.fieldValue are nil, cell is not nil
    cell.fieldName.text = thisPerson.sName;
    cell.fieldValue.text = thisSpouse.sName;

    return cell;

GenericDetailCell.h:

@interface GenericDetailCell : UITableViewCell

@property (nonatomic,weak) IBOutlet UILabel *fieldName;
@property (nonatomic,weak) IBOutlet UILabel *fieldValue;

@end

【问题讨论】:

试试GenericDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PersonCell"];而不是GenericDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PersonCell" forIndexPath:indexPath]; 如果你的故事板是正确的,你应该不需要在viewDidLoad 中注册这个类 - 事实上,这样做就是你遇到问题的原因 - 你得到了那个类的一个实例,但是它没有连接到情节提要 【参考方案1】:

在我看来,您可能正在尝试将 UITableViewCell 预定义样式(例如 UITableViewCellStyleSubtitle)与自定义单元格结合起来。

在情节提要中,如果您为原型单元格选择了预定义样式,则其他控件将无法识别。

要解决此问题,请在原型UITableViewCell 的属性检查器中选择“自定义”类型。然后将您需要的所有控件添加到原型单元格中,包括替换先前自动添加到预定义单元格类型中的默认控件所需的控件。

【讨论】:

没错。我试图将“正确的细节”样式(UITableViewCellStyleValue1)与自定义 UITableViewCell 类一起使用。我试图识别自定义类属性中的默认 UILabels。将样式更改为“自定义”,手动添加 UILabel,将它们引用到自定义单元格属性,并删除 viewDidLoad 中的 registerClass 调用解决了这个问题。 好消息。用搜索做一些测试,因为我怀疑你可能仍然需要为你的searchResultsTableView注册你的自定义单元类。 这个提示为我省去了很多麻烦,我只是遇到了这个问题。 当调用 cellForRowAtIndexPath 时,我遇到了同样的问题,UISearchResultsTableView 中的 UILabel 为零。当我不为搜索结果表调用 registerClass 时,dequeueReusableCellWithIdentifier 返回 nil。当我调用 registerClass 时,dequeueReusableCellWithIdentifier 返回 UILabel 属性为 nil 的自定义类的单元格。 马克我前段时间写了this answer,以回答有关以编程方式设置搜索显示控制器的问题。试试我在第三步下建议的代码。如果这不起作用,请告诉我。

以上是关于UILabel 在 cellForRowAtIndexPath 中为零的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIStackview 中添加和删除 UILabel

如何在 UILabel 中换行

我是不是需要在自定义 UIView 中使用单独的 UILabel 才能在 UITableViewCell 中有单独的 UILabel 行?

当其他 UILabel 增长时自动收缩 UILabel

如果 uilabel 只有一行,则使用 uiLabel 的第二行

在 UITableViewCell 中动态调整 UILabel?