2013-08-26 1 views
1

До сих пор, я делал что-то вроде этого:Как загрузить пользовательскую ячейку из xib, но сохранить выходы внутри ячейки вместо ViewController?

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 

     NSArray *nibsArray = [[NSBundle mainBundle] loadNibNamed:@"BOAFormCell" owner:self options:nil]; 
     self = nibsArray[0]; 
     self.selectionStyle = UITableViewCellSelectionStyleNone; 
     self.valueTextLabel.numberOfLines = 2; 
    } 
    return self; 
} 

Это, очевидно, приводит к утечке памяти.

Если я поместил код загрузки внутри cellForRowAtIndexPath, то он сделает ViewController владельцем xib.and, он будет искать выходные в VC.

Я уже использовал ячейку во многих мониторах ViewControllers.

Я хочу избежать этой утечки, но я не хочу, чтобы все эти VC стали отдельными владельцами xib и реализовали там IBActions и имели свойства для Outlets внутри них.

Должен ли я сделать статический метод, который просто загрузит ячейку из xib и вернет ее мне? , но тогда как я сделаю объект владельцем xib?

ответ

0

Вы должны создать свой .xib-файл, а затем класс, наследующий от UITableViewCell с тем же именем, что и ваш .xib.

В .xib вы будете проектировать свою ячейку, как хотите. Нет ViewController, просто UIViewCell и его выходы.

Выберите свою ячейку, а в утилите/инспекторе задайте класс вашей ячейки имени вашей настроенной ячейки.

enter image description here

Теперь, если вы используете «помощник редактора», вы сможете перетащить выход в .h файл, чтобы добавить свойства к настраиваемой ячейке.

В любом классе вашего проекта, если вы импортируете заголовок вашей новой ячейки, вы будете иметь возможность создавать индивидуальные ячейки по телефону:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; 
UITableViewCell *cell = [nib objectAtIndex:0]; 

(в данном случае, мои файлы называются: CustomCell.h/CustomCell.m/CustomCell.xib)

Свойства, созданные для этой настраиваемой ячейки, доступны как любые свойства любого класса.

+0

в вашем коде, когда вы говорите, «хозяин: я», вы измените права собственности на объект выполнения кода , Нет никакого способа, это ответ на мой вопрос. –

+0

Я не уверен, что понимаю, что вы хотите сделать. У вас есть ячейка, и вы используете ее в нескольких ViewControllers? Итак, вы хотите, чтобы его методы и действия были свойством вашей ячейки и выполнялись вашей ячейкой, а не VC, отображающей ячейку? – zbMax

+0

Да. в точку. но не будет [[NSBundle mainBundle] loadNibNamed: @ Пользователь «CustomCell»: self options: nil]; изменить владельца ячейки на класс, в который я пишу код? –

0

в вашем Tableview вы можете добавить этот код для запуска customcell я надеюсь, что это работает для вас

- (UITableViewCell *)tableView:(UITableView *)tableView 
      cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     CustomCell *cell = 
      [tableView dequeueReusableCellWithIdentifier:@"Cell" 
              forIndexPath:indexPath]; 
     if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; 
    UITableViewCell *cell = [nib objectAtIndex:0]; 

    } 
cell.textLabel.text = @"Hi"; 

return cell; 
    } 
0

Для прошивки 6+ вы должны использовать этот метод:

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier 

Вызовите его перед загрузкой клеток.

Есть и другие методы, которые могут понравиться, где вы также можете регистрировать заголовки нижних колонтитулов, даже сгенерированные ячейки, программно регистрирующие класс с помощью таблицы.

- (void) viewDidLoad { 

     ... 
     [self.tableView registerNib:[UINib nibWithNibName:@"CellId" bundle:nil] forCellReuseIdentifier:cellIdentifier]; 
    } 

    - (UITableViewCell *)tableView:(UITableView *)tableView 
       cellForRowAtIndexPath:(NSIndexPath *)indexPath 
     { 
      CustomCell *cell = 
       [tableView dequeueReusableCellWithIdentifier:@"CellId" 
               forIndexPath:indexPath]; 
     } 

dequeueReusableCellWithIdentifier всегда возвращает ячейку, поэтому нет необходимости проверять cell == nil

Смежные вопросы