我有一个名为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
我正在等待任何解决当前情况的方法,因为我确信反复加载每个单元格并不是最有效的方法。
答案 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创建一个。