как создать пользовательский tableViewCell из xib
Я хочу создать пользовательский TableViewCell, на котором я хочу иметь UITextField с возможностью редактирования. Поэтому я создал новый класс с xib. Добавьте элемент TableViewCell. Перетащите на него UITextField. Добавлено розетки в моем классе, и соединить их все вместе. В моем методе TableView cellForRowAtIndexPath я создаю свои пользовательские ячейки, но это не мои пользовательские ячейки - это просто обычные ячейки. Как я могу решить эту проблему и почему? танкс!
//EditCell. h
#import <UIKit/UIKit.h>
@interface EditCell : UITableViewCell
{
IBOutlet UITextField *editRow;
}
@property (nonatomic, retain) IBOutlet UITextField *editRow;
@end
//EditCell.м
#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;
}
3 ответов
Не используйте инициализатор 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;
}
конечно, вам нужно указать правильное имя пера.
вы можете загрузить пользовательские UITableViewCells из файлов NIB без создания подкласса UITableViewCell сначала, но с подклассом вы можете настроить больше о ячейке.
первое решение, без подкласса:
В ViewController:
* определите ячейку ivar как IBOutlet
UITableViewCell *tableViewCell;
@property (nonatomic, assign) IBOutlet UITableViewCell *tableViewCell;
@synthesize ...
в IB:
* создайте новый пустой файл NIB и откройте в интерфейсе Строитель!--18-->
• перетащите ячейку представления таблицы из библиотеки в окно документа и откройте его двойным щелчком
• настройте ячейку, не забудьте пометить добавленные представления
• выберите ячейку и добавьте идентификатор (для последующего использования в tableView:cellForRowAtIndexPath:)
* установите владельца файла в класс контроллера, который будет загружать эту ячейку
• подключите выход ячейки владельца файла с ячейкой в NIB
In Файл 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.
добавить элементы интерфейса настройте их правильно (set class, ...)
11.
создайте необходимые розетки с помощью Ctrl-Drag в CustomSubclass.ч
-- >слабый или сильный? -- >слабые, сильные только объекты верхнего уровня без предопределенных выходов (т. е. как "вид")
в редакторе кода:
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; }
вам нужно загрузить 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.м:
- (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 с тегом.