我想创建一个自定义的TableViewCell,我想让UITextField具有编辑功能。 所以我用xib创建了新类。添加TableViewCell元素。在它上面拖动UITextField。在我班上添加了插座并将它们连接在一起。在我的TableView方法cellForRowAtIndexPath中,我创建了自定义单元格,但它们不是我的自定义单元格 - 它们只是常用的单元格。我该如何解决这个问题,为什么会这样?感谢名单!
// EditCell。 ħ
#import <UIKit/UIKit.h>
@interface EditCell : UITableViewCell
{
IBOutlet UITextField *editRow;
}
@property (nonatomic, retain) IBOutlet UITextField *editRow;
@end
// EditCell.m
#import "EditCell.h"
@implementation EditCell
@synthesize editRow;
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidUnload
{
// Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
// For example: self.myOutlet = nil;
self.editRow = nil;
}
@end
//在我的代码中
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"EditCell";
EditCell *cell = (EditCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[EditCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:CellIdentifier] autorelease];
}
cell.editRow.text = @"some text to test";
return cell;
}
答案 0 :(得分:14)
不要使用UITableViewCell的初始化程序,但要从笔尖加载单元格:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"EditCell";
EditCell *cell = (EditCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"YourNibNameHere" owner:self options:nil];
cell = (EditCell *)[nib objectAtIndex:0];
}
cell.editRow.text = @"some text to test";
return cell;
}
当然,您需要指定正确的笔尖名称。
答案 1 :(得分:7)
您可以从NIB文件加载自定义UITableViewCells,而无需先创建UITableViewCell的子类,但使用子类可以配置有关该单元格的更多信息。
第一个解决方案,没有子类:
在ViewController中:
•将单元格ivar定义为IBOutlet
UITableViewCell *tableViewCell;
@property (nonatomic, assign) IBOutlet UITableViewCell *tableViewCell;
@synthesize ...
在IB中:
•创建新的空NIB文件并在Interface Builder中打开
•将表格视图单元格从库拖到文档窗口,然后双击打开它
•自定义单元格,不要忘记标记添加的视图
•选择单元格并添加标识符(以后在tableView中使用:cellForRowAtIndexPath:)
•将文件所有者设置为将加载此单元格的控制器类
•使用NIB中的单元格连接文件所有者的单元格出口
在ViewController中:
•在tableView:cellForRowAtIndexPath:
中static NSString * cellIdentifier = @"SameIdentifierAsInNIB";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"NibFileNameWithoutSuffix" owner:self options:nil];
cell = tableViewCell;
// Configure the cell
self.tableViewCell = nil;
}
// Configure the cell
全部设置
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
第二个解决方案,带子类:
在代码编辑器中:
1.
创建UITableViewCell的新子类</ p>
2.
添加initWithCoder方法,添加自定义
- (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // init magic here self.contentView.backgroundColor = [UIColor lightGrayColor]; } return self; }
3.
添加设置值的方法(如“setupCellWith:”)
- (id)setupCellWith:(NSDictionary *)someSetupDict { // more magic here }
- &GT;稍后将从IB
添加奥特莱斯在IB中:
4.
创建新的空XIB文件
5.
更改文件的所有者= UIViewController
6.
从库中拖动TableView单元格
7.
将其类更改为自定义子类(请参阅1.)
8.
设置单元格的标识符属性//小心,与cellForRowAtIndexPath相同:
9.
将文件所有者的视图出口连接到TableView单元格
10.
添加界面元素正确设置它们(设置类,...)
11.
通过Ctrl-Drag创建所需的出口到CustomSubclass.h
- &GT;弱还是强? - &GT;弱的,仅强的顶级对象没有预定义的出口(即像“视图”)
在代码编辑器中:
12.
自定义“tableView:cellForRowAtIndexPath:”
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"CustomIdentifier"; CustomCellSubclass *cell = (CustomCellSubclass *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { //cell = [[CustomCellSubclass alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; UIViewController *tempController = [[UIViewController alloc] initWithNibName:@"CustomCellSubclassXIBName" bundle:nil]; cell = (CustomCellSubclass *)tempController.view; //[tempController release]; // not needed with ARC } // Configure the cell... [cell setupCellWith:…]; // do other setup magic here return cell; }
答案 2 :(得分:3)
您需要加载xib并检索自定义单元格:
NSArray *uiObjects = [[NSBundle mainBundle] loadNibNamed:@"yourNib"
owner:self
options:nil];
for (id uiObject in uiObjects) {
if ([uiObject isKindOfClass:[EditCell class]]) {
cell = (EditCell *) uiObject;
}
}
确保您确实将xib中的tableViewCell类更改为EditCell。 您还需要将tableView行高度更改为正确的大小。
另一种方法是在EditCell类中以编程方式构建您的单元格,我相信让您比InterfaceBuilder更加自由和精确:
在EditCell.m中:
- (id)initWithStyle:(UITableViewCellStyle)style
reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
CGRect textFieldRect = CGRectMake(5, 5, 300, 30);
UITextField *textField = [[UITextField alloc] initWithFrame:textFieldRect];
textField.tag = kTextFieldTag;
[self.contentView addSubview:textField];
[textField release];
}
return self;
}
然后在tableViewController中,按照您的方式创建单元格,并使用标记检索textField。