子类化 UITableViewCell 并在 Storyboard 中使用它
Posted
技术标签:
【中文标题】子类化 UITableViewCell 并在 Storyboard 中使用它【英文标题】:Sublassing UITableViewCell and using it in a Storyboard 【发布时间】:2013-08-03 17:40:44 【问题描述】:我正在测试一个自定义的 UITableViewCell,其中的片段是在 initWithStyle 中自定义的,并且控件是在代码中创建的。我正在测试看看我们是否可以在 UITableView 中将此单元格与情节提要和原型单元格一起使用,并使用情节提要提供的交互。我正在使用的单元格称为 EvenCell。
如果我删除原型单元格并以如下代码实例化该单元格:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
EvenCell *cell=[tableView dequeueReusableCellWithIdentifier:@"MyCell"];
if(cell==nil)
cell=[[EvenCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCell"];
cell.cellTitleLabel.text=[allKeys objectAtIndex:indexPath.row];
return cell;
它有效。
但是当我设置一个原型单元并将它的类设置为 EvenCell 并将标识符重用为“MyCell”时,它不起作用。我做错了什么或者我正在尝试做的事情可能吗?
【问题讨论】:
您是否检查过确实有任何数据发送到cellForRowAtIndexPath:
?如果您在该方法中输入NSLog(@"hey ho");
,它会打印出任何内容吗?还是我误解了你的问题?您是在问为什么它没有出现在模拟器中,或者为什么故事板中的原型看起来不像您的自定义单元格?
为什么它没有出现在模拟器中?看起来如果我们在原型单元格中指定它的类是 EvenCell,那么当我们调用 initWithStyle 时,它应该像第一个示例一样正确呈现。似乎原型单元格并没有真正识别它所基于的自定义单元格。我想看看我们是否可以重用这个已经创建的单元格。谢谢
好的,但是你确定 tableview 还在使用委托/数据源方法吗?你确认cellForRowAtIndexPath
被调用了吗?也许你也应该发布你的initWithStyle
..
您是否确认调用了 iniWithStyle - 如果我没记错的话,它没有被调用。您应该像 user1873508 建议的那样在 IB 中设置您的视图。
我真的很希望能够重用这些自定义表格视图单元格类 - 它们似乎提供了最强大的布局功能。
【参考方案1】:
如果我没看错,您在第二个示例中有空单元格。您需要在界面构建器中将子视图添加到您的单元格内容,并将其作为出口连接到您的 EvenCell 类。例如:在界面生成器中将标签添加到您的自定义单元格,而不是在 EvenCell 类中为该标签创建一个出口,您可以将出口命名为 ex。 titleLabel 并在你的 tableview:cellForRowAtIndexPath 中设置你的标签文本属性 cell.titleLabel.text = [allKeys objectAtIndex:indexPath.row]
我刚刚发现我错过了在 initWithStyle 方法中向单元格内容添加新视图的部分内容。所以我刚刚在 xCode 中创建了示例代码,即使在 EvenCell initWithStyle 方法中以编程方式添加单元格子视图,它也对我有用。这是一个例子:
#import <UIKit/UIKit.h>
@interface EvenCell : UITableViewCell
@property (nonatomic, strong) UILabel *textLabel;
@end
#import "EvenCell.h"
@implementation EvenCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
self.textLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 50, 20)];
[self.contentView addSubview:self.textLabel];
return self;
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
[super setSelected:selected animated:animated];
// Configure the view for the selected state
@end
比在你的 tableView:cellForRowAtIndexPath: 方法中
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellId = @"MyCell";
EvenCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId forIndexPath:indexPath];
if(cell == nil)
cell = [[testCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
cell.textLabel.text = @"Example title";
return cell;
在界面生成器中为 UITableView 设置动态原型单元格,将单元格类设置为 EvenCell 并将单元格标识符设置为 MyCell 并且它必须工作。我刚刚检查过了。
【讨论】:
所以我试图真正重用已经编写的表格视图。似乎一旦我们使用了那个 UITableView,我们就不能使用下面的故事板功能了。 你在哪里设置动态属性? 在界面生成器中单击 TableView,然后它是属性检查器中的第一个属性:内容。可以是静态单元格,也可以是动态单元格 但我从您的界面构建器屏幕截图中看到您设置了动态原型。如果它对您不起作用,请务必检查代表是否设置正确。右键单击 tableView,然后您将看到您的代表是否已连接。 是的,嗯......让我再看看你的例子,看看我做错了什么。尝试重用此代码对我来说可能是个坏主意。以上是关于子类化 UITableViewCell 并在 Storyboard 中使用它的主要内容,如果未能解决你的问题,请参考以下文章
想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?
iOS:使用 nib 子类化 UITableViewCell,进入 UIView(不是视图控制器)子类
在子类化 UITableViewCell 中重写 Func LayoutSubviews 被称为 Double
UITableViewCell 上的 UIPanGestureRecognizer 覆盖 UITableView 的滚动视图手势识别器