UITableViewCell为不同的Orientation和Cell Types加载Custom XIB

时间:2013-02-19 14:44:14

标签: ios ipad cocoa-touch uitableview

我有一个名为ProductiPadCell的自定义单元类,专为iPad设计。 (iOS 5 SDK)

我想要实现的是根据当前状态(扩展与否)和界面方向加载我的自定义单元格。我在视图控制器中处理两个条件,问题是我不喜欢它的性能。我有 NOT 为下面定义的任何xib定义了一个cellIdentifier,最近我检测到我tableView的{​​{1}}

cellForRowAtIndexPath:有4种不同的XIB;

ProductiPadCell

ProductiPadCell defition;

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

TableView的cellForForAtIndexPath

@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

除了目前的方法之外,我应该怎么做才能加载我的xib?在每次方向更改和按钮单击时,我都会调用- (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; } ,因为[tableView reloadData]找不到simpleTableIdentifier,所以它始终会创建新的单元格。如果我将dequeueReusableCellWithIdentifier:simpleTableIdentifier定义为我的单元格xib,则在大小写更改(方向更改,展开状态更改)期间它们不会更改。

细胞标识符的最佳用途是什么?我应该使用simpleIdentifier

以外的其他方法吗?

我正在等待任何解决当前情况的方法,因为我确信反复加载每个单元格并不是最有效的方法。

2 个答案:

答案 0 :(得分:1)

这是单向缓存笔尖

合成此属性

@property (nonatomic, strong) id cellNib;

@synthesize cellNib = _cellNib;

制作自定义getter

-(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];
        }
    }

希望有所帮助

答案 1 :(得分:0)

您应该使用新方法registerNib:forCellReuseIdentifier:来注册您的nib。你为每个笔尖做了一次,在viewDidLoad是个好地方。每个nib中的单元格应该具有重用标识符,用于注册nib,以及出列时的cellForRowAtIndexPath。在cellForRowAtIndexPath中使用的新方法是dequeueReusableCellWithIdentifier:forIndexPath:。使用该方法,并且不需要if(cell == nil)子句,系统将在必要时从nib创建一个。