Как создать пользовательский 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 вы создаете ячейку так, как вы делали, и извлекаете свой текстовый элемент с тегом.