2013-02-19 3 views
2

У меня есть собственный класс ячеек с именем ProductiPadCell, предназначенный для iPad. (iOS 5 SDK)UITableViewCell загрузка пользовательского XIB для разных типов ориентации и ячеек

То, что я пытаюсь достичь, - загрузить мою пользовательскую ячейку в соответствии с текущим состоянием (расширенным или нет) и ориентацией интерфейса. Я обрабатываю оба условия в контроллере представления, проблема в том, что мне не нравится его производительность. Я НЕ определил cellIdentifier для любого из xibs, определенных ниже, и недавно я обнаружил, что мои tableView «ы cellForRowAtIndexPath:

ProductiPadCell имеют 4 различных XIBs которые;

ProductiPadCell-Regular.xib 
ProductiPadCell-Regular-Landscape.xib 
ProductiPadCell-Expanded.xib 
ProductiPadCell-Expanded-Landscape.xib 

ProductiPadCell defition;

@interface ProductiPadCell : UITableViewCell 

@property (weak, nonatomic) IBOutlet UIButton *detailButton; 
@property (weak, nonatomic) IBOutlet UILabel *productDescriptionLabel; 
@property (weak, nonatomic) IBOutlet TTTAttributedLabel *timeLabel; 
@property (weak, nonatomic) IBOutlet TTTAttributedLabel *def1Label; 
@property (weak, nonatomic) IBOutlet TTTAttributedLabel *def2Label; 
@property (weak, nonatomic) IBOutlet UIImageView *thumbnail; 
    // appears in case the cell is expanded 
    @property (weak, nonatomic) IBOutlet UIView *detailHolderView; 
    @property (weak, nonatomic) IBOutlet UILabel *detailLabel; 
// calls a method at the superview's ViewController 
- (void)presentDetailViewWithIndex:(NSInteger)index; 
@end 

cellForForAtIndexPath Tableview в

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // table identifier does not matches the xib's cell identifier 
    // cell identifier of all 4 xibs are "" (empty) 

    static NSString *simpleTableIdentifier = @"Cell"; 
    BOOL isExpanded = [[[targetDictionary objectForKey:@"isItemExpanded"] objectAtIndex:indexPath.row] boolValue]; 

    ProductiPadCell *cell = (ProductiPadCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    if (cell == nil) 
    { 
     // Load the required nib for the current orientation and detail selection style 
     if (deviceOrientation == UIDeviceOrientationPortrait) { 
      if (isExpanded) { 
       NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProductiPadCell-Regular-Expanded" owner:self options:nil]; 
       cell = [nib objectAtIndex:0]; 
       // additional settings for expanded case 
      } 
      else { 
       NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProductiPadCell-Regular" owner:self options:nil]; 
       cell = [nib objectAtIndex:0]; 
       // additional settings for NOT expanded case      
      } 
     } 
     else {  
      if (isExpanded) { 
       NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProductiPadCell-Landscape-Expanded" owner:self options:nil]; 
       cell = [nib objectAtIndex:0]; 
      } 
      else { 
       NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProductiPadCell-Regular-Landscape" owner:self options:nil]; 
       cell = [nib objectAtIndex:0]; 
      } 
     } 
    } 

    // connect cell information with cell IBOutlets 
    cell.productDescriptionLabel.text = [[targetDictionary objectForKey:@"key"] objectAtIndex:indexPath.row]; 
    // .... 

    [cell.thumbnail setImage:[UIImage imageNamed:@"thumb_image.jpg"]]; 
    [cell.thumbnail.layer setCornerRadius:7.0f]; 
    [cell.thumbnail.layer setBorderWidth:5.0f]; 
    [cell.thumbnail.layer setBorderColor:[UIColor clearColor].CGColor]; 
    [cell.thumbnail setClipsToBounds:YES]; 

    if (isExpanded) { 
     cell.detailLabel.text = [[targetDictionary objectForKey:@"key"] objectAtIndex:indexPath.row]; 

    } 

    return cell; 
} 

Что я должен сделать для того, чтобы загрузить мои XIb, другие, чем мой нынешний подход? При каждом изменении ориентации и нажатии кнопки я вызываю [tableView reloadData], а так как dequeueReusableCellWithIdentifier:simpleTableIdentifier не находит simpleTableIdentifier, он всегда создает новые ячейки. Если я определяю simpleIdentifier для своих xib-элементов, они не меняются во время изменений в случае (изменение ориентации, расширение изменения состояния).

Какое максимальное использование идентификаторов ячеек? Должен ли я использовать другой подход, отличный от dequeueReusableCellWithIdentifier:simpleTableIdentifier

Я жду какого-либо решения моей текущей ситуации, потому что я уверен, что загрузка каждой ячейки снова и снова не является самым эффективным способом сделать это.

ответ

1

Это один из способов, кэш СИБ

синтезирует это свойство

@property (nonatomic, strong) id cellNib; 

@synthesize cellNib = _cellNib; 

Сделать заказ добытчика

-(id)cellNib 
{ 
    if (!_cellNib) 
    { 
     Class cls = NSClassFromString(@"UINib"); 
     if ([cls respondsToSelector:@selector(nibWithNibName:bundle:)]) 
     { 
      _cellNib = [[cls nibWithNibName:@"SomeCell" bundle:[NSBundle mainBundle]] retain]; 
     } 
    } 

    return _cellNib; 
} 

в viewDidLoad

[self.tableView registerNib:[UINib nibWithNibName:@"SomeCell" bundle:nil] forCellReuseIdentifier:kCellIdentification]; 

в Tableview: cellForRowAtIndexPath:

SomeCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentification]; 
    if (cell == nil) 
    { 
     //If nib cache 
     if ([self cellNib]) { 
      NSArray* viewFromNib = [[self cellNib] instantiateWithOwner:self options:nil]; 
      cell = (SomeCell *)[viewFromNib objectAtIndex:0]; 
     }else { //nib not cache 
      NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"SomeCell" owner:nil options:nil]; 
      cell = (SomeCell *)[views objectAtIndex:0]; 
     } 
    } 

Надежда, что помогает

+0

только для того, чтобы убедиться, что я правильно понял, у меня просто есть 4 разных cellNib для моего случая, где каждый из них имеет разные идентификаторы и регистрирует все 4 моих перья в viewDidLoad (как вы указали). После этого я проверяю, какой ниб Мне нужно в tableView: cellForRowAtIndexPath: и вызвать dequeueReusableCellWithIdentifier: с этим идентификатором? Это первый раз, когда я вижу registerNib: forCellReuseIdentifier: и его обычно не используют. Благодаря ! – Bartu

0

Вы должны использовать новый метод, registerNib: forCellReuseIdentifier: зарегистрировать свои наконечники. Вы делаете это один раз для каждого наконечника, в viewDidLoad - хорошее место. Ячейка в каждом nib должна иметь идентификатор повторного использования, который вы используете для регистрации nib, а также в cellForRowAtIndexPath при удалении. Новый метод для использования в cellForRowAtIndexPath - это dequeueReusableCellWithIdentifier: forIndexPath :. Используйте этот метод, и нет необходимости иметь предложение if (cell == nil), при необходимости система создаст один из nib.

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