Как создать пользовательский tableViewCell от xib
Я хочу создать собственный 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;
}
Ответы
Ответ 1
Не используйте инициализатор UITableViewCell, но сделайте загрузку ячейки из вашего nib:
- (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;
}
Конечно, вам нужно указать правильное имя ниба.
Ответ 2
Вы можете загружать пользовательские UITableViewCells из файлов NIB, не создавая сначала подкласс 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
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
}
- > Выходы будут добавлены позже из IB
В IB:
4.
Создать новый пустой XIB файл
5.
Изменить владельца файла = UIViewController
6.
Перетащите ячейку TableView из библиотеки
7.
Измените свой класс на пользовательский подкласс (см. 1.)
8.
Задайте свойство идентификатора ячейки//осторожно здесь, то же, что и в cellForRowAtIndexPath:
9.
Подключить точку доступа владельца файла к ячейке TableView
10.
Добавить элементы интерфейса правильно настроили их (установить класс,...)
11.
Создайте точки, необходимые с помощью Ctrl-Drag, в CustomSubclass.h - > слабый или сильный? → слабые, сильные только объекты верхнего уровня без предопределенных точек (т.е. как "вид" )
В редакторе кода:
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;
}
Ответ 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;
}
}
Убедитесь, что вы фактически изменили класс tableViewCell в xib на 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 вы создаете ячейку так, как вы делали, и извлекаете свой текстовый элемент с тегом.