cellForRowAtIndexPath和NSBundle mainBundle的问题

时间:2011-01-21 21:52:02

标签: objective-c uitableview nsbundle custom-cell

有想法解决这个问题吗?

这是正确和错误的方式尊重:
alt text alt text

这是有效的代码:

- (UITableViewCell *)[...] cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    @try {
        newsRow = ((NewsRowController *)[tableView dequeueReusableCellWithIdentifier:@"cell"]);
        if (newsRow == nil) {
            if ( [[Device GetModel] isEqualToString:@"iPad Simulator"] || 
                 [[Device GetModel] isEqualToString:@"iPad"])
                [[NSBundle mainBundle] loadNibNamed:@"NewsRow_ipad" owner:self options:nil];
            else [[NSBundle mainBundle] loadNibNamed:@"NewsRow" owner:self options:nil];

            if ([tableArray count] > 0)
                [newsRow setData:[tableArray objectAtIndex:indexPath.row]];
        }       
    }
    @catch (NSException * e) {
        NSLog(@"a!!!!!");
    }
    return newsRow;
}

...但是因为在我的3g设备中,当我向上/向下滚动表时慢慢地 我以这种方式更改了代码,在viewDidLoad中插入设备检查并通过它在cellForRowAtIndexPath

NSArray *cRow;
@property (nonatomic, retain) NSArray *cRow;
[...]
@syntetize cRow;

- (void)viewDidLoad {
[...]
    if ( [[Device GetModel] isEqualToString:@"iPad Simulator"] 
        || 
        [[Device GetModel] isEqualToString:@"iPad"])
        cRow  = [[[NSBundle mainBundle] loadNibNamed:@"NewsRow_ipad" owner:self options:nil] retain];
        else cRow = [[[NSBundle mainBundle] loadNibNamed:@"NewsRow" owner:self options:nil] retain];
[...]
}

- (UITableViewCell *)[...] cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    @try {
        newsRow = ((NewsRowController *)[tableView dequeueReusableCellWithIdentifier:@"cell"]);
        if (newsRow == nil) {

            //
            // ADDED CODE.
            //
            newsRow = [cRow objectAtIndex:0];    
            //

            if ([tableArray count] > 0)
                [newsRow setData:[tableArray objectAtIndex:indexPath.row]];
        }       
    }
    @catch (NSException * e) {
        NSLog(@"a!!!!!");
    }
    return newsRow;
}

现在桌子只显示了一行。如果我滚动,行会改变,但它只显示一行...
alt text
有什么问题?

有帮助吗?

感谢,

1 个答案:

答案 0 :(得分:1)

在这种情况下,当您调用dequeueReusableCellWithIdentifier时:由于没有可以出列的单元格,因此您将返回nil。每次获得nil单元格时都需要加载nib,否则在第一个单元格之后不会向表格中添加任何单元格。

如果调用GetModel正在减慢速度,您可以在viewDidLoad中调用它并将其存储以供日后使用。

由于您在每个单元格中绘制的视图数量很多,因此您的表格很可能不会平滑滚动。如果您的背景始终是纯色,则应确保要添加到单元格或不透明的所有视图。如果您需要图像或渐变背景,那么您应该在一个视图中查看所有单元格。 Apple在这里有一个很好的例子:TableViewSuite。特别检查TimeZoneView文件。