как создать пользовательский 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 с тегом.