У меня есть собственный класс ячеек с именем 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
Я жду какого-либо решения моей текущей ситуации, потому что я уверен, что загрузка каждой ячейки снова и снова не является самым эффективным способом сделать это.
только для того, чтобы убедиться, что я правильно понял, у меня просто есть 4 разных cellNib для моего случая, где каждый из них имеет разные идентификаторы и регистрирует все 4 моих перья в viewDidLoad (как вы указали). После этого я проверяю, какой ниб Мне нужно в tableView: cellForRowAtIndexPath: и вызвать dequeueReusableCellWithIdentifier: с этим идентификатором? Это первый раз, когда я вижу registerNib: forCellReuseIdentifier: и его обычно не используют. Благодаря ! – Bartu