自定义表格视图单元格中没有可见视图
Posted
技术标签:
【中文标题】自定义表格视图单元格中没有可见视图【英文标题】:No Visible View in Custom Table View Cell 【发布时间】:2013-07-26 07:24:52 【问题描述】:我正在做一个关于tableView
和tableViewCell
的练习。而且我在自定义视图单元格方面遇到了一些问题。
我已经创建了我自己的自定义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 - 点击自定义表格视图单元格中的删除表格视图行按钮