自定义单元格未显示
Posted
技术标签:
【中文标题】自定义单元格未显示【英文标题】:custom cell not being displayed 【发布时间】:2014-05-21 16:55:08 【问题描述】:所以我创建了一个自定义单元格(使用 .xib 文件)并使用自定义控制器类链接它,我也没有忘记写入单元格标识符。我还在我的表格视图控制器原型单元格中给出了相同的单元格标识符。在自定义单元控制器类中,我只有一个到 .h 文件中的文本标签的出口。下面是我的表格视图控制器的代码。当我运行该应用程序时,不会显示自定义单元格,但那里有单元格,因为我可以单击它们(但它们只是白色的)。我做错了什么,为什么不显示自定义单元格?
如果我使用默认单元格(不是自定义),那么一切正常。所以问题是我没有在某处正确使用我的自定义单元格。
#import "ListmaniaTableViewController.h"
#import "ListmaniaTableViewCell.h"
@interface ListmaniaTableViewController ()
@property (strong, nonatomic) NSMutableArray *tasks; //of task object
@end
@implementation ListmaniaTableViewController
- (void)viewDidLoad
[super viewDidLoad];
task *task1 = [[task alloc] init];
task1.taskDescription = @"TASK 1";
[self.tasks addObject:task1];
task *task2 = [[task alloc] init];
task2.taskDescription = @"TASK 2";
[self.tasks addObject:task2];
task *task3 = [[task alloc] init];
task3.taskDescription = @"TASK 3";
[self.tasks addObject:task3];
- (NSMutableArray *)tasks
if(!_tasks)
_tasks = [[NSMutableArray alloc] init];
return _tasks;
/*- (id)initWithStyle:(UITableViewStyle)style
self = [super initWithStyle:style];
if (self)
return self;
*/
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"Add New Item"])
- (void)addNewTask:(task *)newTask
[self.tasks addObject:newTask];
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
// Return the number of sections.
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
// Return the number of rows in the section.
return [self.tasks count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
ListmaniaTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ListmaniaCell" forIndexPath:indexPath];
if(!cell)
[tableView registerNib:[UINib nibWithNibName:@"ListmaniaTableViewCell" bundle:nil] forCellReuseIdentifier:@"ListmaniaCell"];
cell = [tableView dequeueReusableCellWithIdentifier:@"ListmaniaCell" forIndexPath:indexPath];
return cell;
- (void)tableView:(UITableView *)tableView willDisplayCell:(ListmaniaTableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
task *task = [self.tasks objectAtIndex:indexPath.row];
NSString *taskLabel = task.taskDescription;
cell.taskLabel.text = taskLabel;
@end
【问题讨论】:
【参考方案1】:但是
[self.tableView registerNib:[UINib nibWithNibName:@"ListmaniaTableViewCell" bundle:nil] forCellReuseIdentifier:@"ListmaniaCell"];
在viewDidLoad:
.
【讨论】:
当我这样做时,应用程序在启动时崩溃,并且控制台显示“以 NSException 类型的未捕获异常终止” 当它崩溃时我确实使用了 self.tableView 崩溃日志说明了什么? 同样的事情“以 NSException 类型的未捕获异常终止”【参考方案2】:tableView:willDisplayCell:forRowAtIndexPath:
方法中的代码应该在tableView:cellForRowAtIndexPath:
方法中。像这样:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
ListmaniaTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ListmaniaCell" forIndexPath:indexPath];
if(!cell)
[tableView registerNib:[UINib nibWithNibName:@"ListmaniaTableViewCell" bundle:nil] forCellReuseIdentifier:@"ListmaniaCell"];
cell = [tableView dequeueReusableCellWithIdentifier:@"ListmaniaCell" forIndexPath:indexPath];
task *task = [self.tasks objectAtIndex:indexPath.row];
NSString *taskLabel = task.taskDescription;
cell.taskLabel.text = taskLabel;
return cell;
【讨论】:
这不会改变任何东西(我只是再试了一次,没有改变)【参考方案3】:我发现了问题所在。我在自定义单元中有一个双重链接的出口。我还按照@dasdom 的建议将下面的行移到了 viewdidload 中
[self.tableView registerNib:[UINib nibWithNibName:@"ListmaniaTableViewCell" bundle:nil] forCellReuseIdentifier:@"ListmaniaCell"];
【讨论】:
以上是关于自定义单元格未显示的主要内容,如果未能解决你的问题,请参考以下文章