Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在iPhone上为UITableView创建具有交替颜色的行?_Ios_Objective C_Uitableview_Cocoa Touch_Cell - Fatal编程技术网

Ios 如何在iPhone上为UITableView创建具有交替颜色的行?

Ios 如何在iPhone上为UITableView创建具有交替颜色的行?,ios,objective-c,uitableview,cocoa-touch,cell,Ios,Objective C,Uitableview,Cocoa Touch,Cell,我希望有两种颜色的交替行,像第一个黑色,第二个白色,第三个黑色,等等 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; cell = ((MainCell*)[tableView dequeueReusableCellWithIdentifier:Cel

我希望有两种颜色的交替行,像第一个黑色,第二个白色,第三个黑色,等等

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
cell = ((MainCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]);
if (cell==nil) {

    NSArray *topLevelObjects=[[NSBundle mainBundle] loadNibNamed:@"MainCell"    owner:self options:nil];

    for (id currentObject in topLevelObjects){
        if ([currentObject isKindOfClass:[UITableViewCell class]]){
            if ((indexPath.row % 2)==0) {
                [cell.contentView setBackgroundColor:[UIColor purpleColor]];

            }else{
                [cell.contentView setBackgroundColor:[UIColor whiteColor]];

            }
            cell =  (MainCell *) currentObject;
            break;
        }
    }

}else {

    AsyncImageView* oldImage = (AsyncImageView*)
    [cell.contentView viewWithTag:999];
    [oldImage removeFromSuperview];
}return cell;
问题是,当我快速滚动时,单元格的背景变为最后两个单元格的黑色,前两个单元格的白色或类似的东西,但如果我滚动缓慢,效果会很好。 我认为问题在于reusableCell的缓存

有什么想法吗

TIA

细胞被回收(这就是当你把它们排出来并检查它是否为零时所做的事情)。因此,不要在创建单元格时设置背景色,而是在创建后的某个时间设置背景色。因此:

if( !cell ) {
  // create the cell and stuff
}
if( [indexPath row] % 2)
  [cell setBackgroundColor:[UIColor whiteColor]];
else
  [cell setBackgroundColor:[UIColor purpleColor]];

我认为发生的事情是,当您将一个可重用单元出列时,您并没有按照定义的顺序这样做。正如可能发生的那样,当您缓慢滚动时,单元格一次一个可用,并按顺序向您排队。快速滚动时,顺序将变得未定义,它们的出列顺序也是如此。我相信这就是为什么(在很大程度上)苹果公司设计了UITableView API来根据标识符进行排队——这样你就可以很容易地重用不同类型的单元格,比如不同颜色的单元格。因此,我建议修改代码,使每个单元格颜色都有自己的标识符。(此外,如果可能,请使用一个插座将此tableview数据源直接连接到单元格,或者在加载一次后将其保存在ivar中,然后复制它,而不是在高级对象中循环)

如果您将CellIdentifier设置为字符串文字,不行static@JaredP:将指针指向字符串文本静态并没有什么错。我仍然认为是java!。。但据我所知,静态标识符的值在第一次分配时保持不变…@Mat:yes,它将被分配到函数的自动范围之外。在这种情况下,这可能没什么大不了的,但是使用静电没有什么错,而且它被用在了苹果的锅炉板上。我相信在这种情况下,使它成为静电会给你一个加速。在出列代码中,当比较重用标识符的相等性时,如果使用静态字符串,则指针将匹配,这意味着它不必继续进行更昂贵的字符串比较。这可能是一个最小的好处,但我打赌这就是为什么他们这么做。不要这样做。如果只是更改背景颜色,则与单元格内容类似,因此请使用相同的标识符。如果您有不同的单元格排列或其他内容,您将使用不同的标识符。对于这样的东西,使用不同的标识符会浪费资源。比如2个具有2个不同标识符的nib文件?@Mat:如果单元格的布局不同,则会使用不同的标识符。所以是的,如果你有两个笔尖,你加载的内容是完全不同的。在这种情况下,你不希望意外地得到错误类型的细胞回来。但是你不能用它来做简单的改变,比如背景色或者其他什么。在这种特殊的情况下,你最多只能在桌子的使用寿命内额外加载两个单元格,所以这不会是一个巨大的成本。此外,只有在我建议以不同的方式加载单元格(而不是从nib加载)之后,这才可以接受,因为这将大大降低创建成本。话虽如此,你的答案绝对更好。这种方法对我不起作用。在尝试了各种方法之后,唯一可行的方法是对不同颜色的单元格使用不同的重用标识符。您不能在CellForRowatineXpath中设置单元格背景。您可以在willDisplayCell方法中进行设置。