在 iOS 中使用自定义单元格时无法查看 UITableViewCell
Posted
技术标签:
【中文标题】在 iOS 中使用自定义单元格时无法查看 UITableViewCell【英文标题】:Unable to view UITableViewCell when using custom cell's in iOS 【发布时间】:2014-01-11 05:40:47 【问题描述】:我在我的应用程序中使用自定义 UITableViewCell 来为每一行显示一个简单的标签。但是,由于某种原因,我无法显示包含要在每个单元格中显示的文本的数组的内容。我使用 Interface Builder 在 .xib 文件中制作了自定义 UITableViewCell,而使用此自定义 UITableViewCell 的 viewController 位于我的故事板文件中。
这是我的屏幕在 IB 中的样子:
这是我的自定义 UITableViewCell 类中的相关方法:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
// Initialization code
return self;
因为我已经在 IB 中完成了所有工作,所以我没有在 initWithStyle 方法中包含任何代码。
我在 ViewController 中使用自定义单元格的相关代码如下:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
self.menuArray = @[@"Apples", @"Pears", @"Bananas", @"Oranges", @"Peaches"];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"Cell";
MenuTableCell *cell = (MenuTableCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = (MenuTableCell *)[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.menuLabel.text = [self.menuArray objectAtIndex:indexPath.row];
return cell;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [self.menuArray count];
谁能看出我做错了什么?
【问题讨论】:
为什么要创建 3 个单元格,1 个就足够了 并声明section中的行数 我没有创建三个单独的单元格,这是同一个单元格,只是右侧工具栏的不同视图。 【参考方案1】:如果你在 xib 文件中创建一个单元格,你应该在 viewDidLoad 中调用 registerNib:forIdentifier:。如果这样做,则无需检查 cellForRowAtIndexPath 中的零单元格。
【讨论】:
非常感谢您的回答。我快到了。出于某种原因,我的表格单元格现在显示“标签”,而不是数组中的正确值。你明白为什么吗? 另外,如果我按照您的建议进行操作,我将如何从 viewDidLoad 调用 registerNib:forIdentifier,那么我的 cellForRowAtIndexPath 中的代码会是什么样子?我可以简单地完全删除 if (cell == nil) 块吗? @syedfa,是的,您可以删除 cell==nil 块。它是这样调用的——[self.tableView registerNib:[UINib nibWithNibName:@"SampleCell1" bundle:nil] forCellReuseIdentifier:@"SampleCell1"];【参考方案2】:我认为这对您有用....并检查您的标签插座连接以显示正确的答案
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section
return [menuArray count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"CustomCell";
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
cell.menuLabel.text = [self.menuArray objectAtIndex:indexPath.row];
【讨论】:
【参考方案3】:在您的 viewController 中实现以下所需的方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [self.menuArray count];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [self.menuArray count];
我已经编辑了 cellForRowAtIndexPath 看看它
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"Cell";
MenuTableCell *cell = (MenuTableCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
//Edited Code for creating the cell*****************************************
if (cell == nil)
NSArray *objectsArray = [[NSBundle mainBundle] loadNibNamed:@"MenuTableCell" owner:self options:nil];
for (id objectCell in objectsArray)
cell = (MenuTableCell*)objectCell;
cell.menuLabel.text = [self.menuArray objectAtIndex:indexPath.row];
return cell;
希望这对你有用
【讨论】:
非常感谢您的解决方案,我的代码几乎可以工作了。出于某种原因,每个表格单元格都显示文本“标签”而不是 self.menuArray 中的适当值。你明白为什么吗? @syedfa 嘿,您可以写下NSLog(@"currentLabel:%@",[self.menuArray objectAtIndex:indexPath.row]);
并查看它实际返回的内容。如果它返回你想要的,那么可能是你没有将 menuLabel 链接到 xib 中的标签【参考方案4】:
在yourViewController
中添加numberOfRowsInSection
方法,如下所示
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [self.menuArray count];
【讨论】:
以上是关于在 iOS 中使用自定义单元格时无法查看 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章
在每个单元格都包含表格视图的表格视图中选择新单元格时,无法取消选择先前选择的单元格