自定义表格视图单元格中没有可见视图

Posted

技术标签:

【中文标题】自定义表格视图单元格中没有可见视图【英文标题】:No Visible View in Custom Table View Cell 【发布时间】:2013-07-26 07:24:52 【问题描述】:

我正在做一个关于tableViewtableViewCell 的练习。而且我在自定义视图单元格方面遇到了一些问题。

我已经创建了我自己的自定义tableViewCell,其中.xib 文件称为newCellView.xib。我需要 .h 和 .m 文件,我选择超类为UITableViewCell

在我称为TableViewController 的视图控制器中,我正在创建一个带有默认单元格的表格。

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

 UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

   cell.textLabel.text = [showNames objectAtIndex:[indexPath row]];
   cell.imageView.image = [UIImage imageNamed:[iconArray objectAtIndex:[indexPath row]]];

 return cell;

一旦我创建了自己的自定义视图。我将newViewCell.h 导入到我的viewController 中,并像这样更新了代码。

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


static NSString *newCellViewString = @"newCellView";

newCellView *cell = [tableView dequeueReusableCellWithIdentifier:newCellViewString];

 //newCellView *cell = [[newCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:newCellView];
if (cell == nil)

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"newCellView" owner:self options:nil];
    cell = (newCellView *)[nib objectAtIndex:0];

但是当我运行应用程序时,我看到一个空白页面,就像我没有相关视图一样。也许我忘了添加一些连接。我什至看不到要查看的空单元格。只有一个白色的空白页。任何帮助都会很棒。谢谢。

编辑其他文件

这是我的 .h 和 .m 文件。

#import <UIKit/UIKit.h>

@interface newCellView : UITableViewCell <UITableViewDelegate>

@property (nonatomic, strong) IBOutlet UILabel *nameLabel;
@property (nonatomic, strong) IBOutlet UIImageView *iconImageView;
@property (retain, nonatomic) IBOutlet UIButton *extendButton;

@end

.m 文件

#import "newCellView.h"

@implementation newCellView

@synthesize nameLabel;
@synthesize extendButton;
@synthesize iconImageView;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) 
    // Initialization code

return self;


- (void)setSelected:(BOOL)selected animated:(BOOL)animated

[super setSelected:selected animated:animated];

// Configure the view for the selected state


- (void)dealloc 
[extendButton release];
[nameLabel release];
[iconImageView release];
[super dealloc];

@end

【问题讨论】:

似乎您的表格视图也位于某些视图检查数据源的后面 您是否为标签和图像视图创建对象并将其与 newViewCell.xib 中的 newViewCell 连接? 那么我应该怎么做才能看到它?将该视图设置为 root ? @BaZinga 我想我做到了。但是添加了文件供您检查。 所以你现在可以在你的单元格中找到 cell.nameLable 用于行方法 【参考方案1】:

在处理自定义单元格时,我总是尝试将与单元格相关的所有内容封装在 UITableViewCell 子类中(包括 NIB / outlets / ..),并使用tableView registerClass: forCellReuseIdentifier: 方法告诉我的表格使用哪个类为它的细胞。

在你的例子中你可以这样做:

在你的 newCellView.m 中,在单元格初始化中添加 nib 加载:

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) 
    // Initialization code
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"newCellView" owner:self options:nil];
    self = [nib objectAtIndex:0];


return self;

确保所有插座连接正确。 (即 Nib 中的 UITableViewCell 属于 NewCellView 类,..)

然后在控制器的 viewDidLoad 中告诉表格使用 newCellView 作为其单元格:

[yourTableView registerClass:[newCellView class] forCellReuseIdentifier:@"newCellView"];

终于在cellForRowAtIndexpath中:

newCellView *cell = [tableView dequeueReusableCellWithIdentifier:@"newCellView"];

if (cell == nil)

    cell = [[NewCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"newCellView]";

【讨论】:

这行得通!不需要 if (cell == nil) 部分,因为我们已经在使用 registerClass【参考方案2】:

我认为,您的问题的问题是自定义单元格未附加到自定义类单元格。 当您创建 UITableViewCell 类时,它不会随之创建 xib。 然后您需要创建一个 xib 文件,该文件需要附加到自定义类文件中。

创建一个 EMPTY NIB 文件,没有内容。然后通过对象添加一个uitablecustomcell, 当您添加新对象时,GO TO File Inspector 并在 File Name 中输入名称 newCellView。 现在自定义单元格将显示 EMPTY 行。

现在,向自定义单元格添加几个视图,并通过在 .h 文件中创建的 IBOutlets 附加这些视图,即 nameLabel、iconImageView、extendButton。

【讨论】:

【参考方案3】:

这是我之前遇到的一个简单错误。你忘了打字。应该是:

cell = (newCellView*)[nib objectAtIndex:0];

如果这不能解决您的问题,请确保您已将 xib 文件设置为使用“newCellView”类而不是默认的“UITableViewCell”类。 此外,如果您手动创建了一个 tableview 并将其添加为另一个视图的子视图或将其设置为您在 loadView 方法或类似方法中的视图,而不是子类化 UITableViewController ,请确保您为 tableview 设置框架并将其添加为子视图。

您可能希望从 newCellView.h 类中删除 。表视图的委托不应是视图或视图的子类。尤其是表格视图将呈现的单元格。 UITableViewController 应该接收委托方法。

【讨论】:

实际上在我忘记再次编辑之前就是这样。谢谢,但仍然无法正常工作。 如何设置框架为子视图? 我不确定你的意思。你的意思是你如何设置框架?仅当您手动创建 tableView 的实例时才应该这样做。如果你这样做了,你可以使用 [tableview setFrame:[UIScreen mainScreen].bounds];【参考方案4】:

我找到了答案。除了单元格视图的定位之外,我的代码中的一切都运行良好。

项目使用自动布局作为默认属性。因此,每当我看到白页时,实际上单元格都超出了范围。我禁用了自动布局并从尺寸检查器中设置了项目的移动属性。

感谢您的努力。

【讨论】:

以上是关于自定义表格视图单元格中没有可见视图的主要内容,如果未能解决你的问题,请参考以下文章

图像不适合自定义表格视图单元格中的图像视图

Obj-C - 点击自定义表格视图单元格中的删除表格视图行按钮

使用自定义表格视图单元格中的故事板segue

自定义表格视图单元格中的 UITextField。点击单元格/文本字段时显示选择器视图

以swift语言在自定义表格视图单元格中更新进度视图下载

iOS:自定义表格视图单元格中的约束