gpt4 book ai didi

iphone - iOS : UITableView reloadData not working

转载 作者:行者123 更新时间:2023-12-03 20:26:59 27 4
gpt4 key购买 nike

我有一个 UITableView,有两个部分:免费和付费。每个部分都有不同类型的单元。空闲单元有两个标签和一个图像。付费单元有两个标签,一个图像和一个允许购买产品的按钮。购买产品后,该特定单元格上的“购买”按钮不得再次显示。也就是说,这就是单元格的初始化方式...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *IDNormal = @"Normal";
static NSString *IDComplex = @"Complex";


if (indexPath.section == 0) { // show free objects

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:IDNormal];

if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:IDNormal] autorelease];

// product description
UILabel * labelDescription = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 54.0, 225, 18)];
[labelDescription setTextAlignment:UITextAlignmentLeft];
[labelDescription setBackgroundColor:[UIColor whiteColor ]];
[labelDescription setClipsToBounds:YES];
[labelDescription setFont:[UIFont systemFontOfSize:14.0]];
[labelDescription setTextColor:[UIColor blackColor]];
[labelDescription setAlpha:0.6];
[labelDescription setTag: 860];
[cell addSubview:labelDescription];
[labelDescription release];

// this will show the word FREE on free objects (cells)
UILabel * labelFREE = [[UILabel alloc] initWithFrame:CGRectMake(235.0, 54.0, 80, 18)];
[labelFREE setTextAlignment:UITextAlignmentCenter];
[labelFREE setBackgroundColor:[UIColor greenColor ]];
[labelFREE setClipsToBounds:YES];
[labelFREE setFont:[UIFont boldSystemFontOfSize:14.0]];
[labelFREE setTextColor:[UIColor blackColor]];
[labelFREE setAlpha:0.75];
[labelFREE setText:NSLocalizedString(@"freeKey", @"")];
[labelFREE setTag: 861];
[cell addSubview:labelFREE];
[labelFREE release];

}


cell.imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:[NSString stringWithFormat: @"free%d", indexPath.row] ofType:@"jpg"]];
NSString * prefixLabel = [NSString stringWithFormat: @"gratis%d", indexPath.row];

UILabel *labelDescription2 = (UILabel*)[cell viewWithTag:860];
[labelDescription2 setText:@"FREE"];

return cell;

} else { // show paid objects

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:IDComplex];

if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:IDComplex] autorelease];

UILabel * labelDescription = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 54.0, 225, 18)];
[labelDescription setTextAlignment:UITextAlignmentLeft];
[labelDescription setBackgroundColor:[UIColor whiteColor ]];
[labelDescription setClipsToBounds:YES];
[labelDescription setFont:[UIFont systemFontOfSize:14.0]];
[labelDescription setTextColor:[UIColor blackColor]];
[labelDescription setAlpha:0.6];
[labelDescription setTag: 1];
[cell addSubview:labelDescription];
[labelDescription release];

}



int numberPaidObject = indexPath.row + 500;



cell.imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:[NSString stringWithFormat: @"table-pg%d", numberPaidObject] ofType:@"jpg"]];

NSString * nomeDoProduto = [NSString stringWithFormat: @"paid%d", numberPaidObject];


if ( NotSoldProduct ) {

NSString * prefixoEtiqueta = [NSString stringWithFormat: @"paid%d", numberPaidObject];

UILabel *labelDescription2 = (UILabel*)[cell viewWithTag:1];
[labelDescription2 setText:[description objectAtIndex: numberPaidObject ];

}

return cell;

}
}

因为我必须确定单击了哪个“购买”按钮,并且我正在使用 dequeueReusableCellWithIdentifier,所以我必须使用以下方法...

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

int numeroOfPaidObject = indexPath.row + 500;

if ((indexPath.section == 1) && ObjectForSale) {
// if paid objects and object was not bought yet
// in theory this section will not be executed if the object was already bought and paid
// so, I am skipping the BUY button creation and, in theory the cell will not have a BUY
// button… the problem is that it does...

UIButton * buyButton = [[UIButton alloc] initWithFrame:CGRectMake( 235, 45, 80, 30)];
buyButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
buyButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
[buyButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
buyButton.titleLabel.font = [UIFont boldSystemFontOfSize:14];
buyButton.backgroundColor = [UIColor clearColor];
[buyButton addTarget:self action:@selector(buyNow:) forControlEvents:UIControlEventTouchDown];

[buyButton setTitle:NSLocalizedString(@"buyKey", @"") forState:UIControlStateNormal];

UIImage *newImage = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]
pathForResource: @"whiteButton" ofType:@"png"]]
stretchableImageWithLeftCapWidth:12.0f topCapHeight:0.0f];

[buyButton setBackgroundImage:newImage forState:UIControlStateNormal];

[buyButton setTag: numeroOfPaidObject];
[cell addSubview:buyButton];

[buyButton release];
}
}

此代码的问题是:当我重新加载表的数据时,“购买”按钮继续显示在所有单元格上,包括用户已购买的单元格。

有什么想法吗?

感谢您的帮助。

最佳答案

您可以使用调试器单步执行它,但这是我的猜测:

由于表格单元格被重复使用,最终所有已购买的商品最终都会出现在之前被未购买的商品占据的表格单元格中,因此添加了购买按钮。

如果是这种情况,您需要在代码的第二部分中添加一个 else 子句,以便在产品已被购买时从单元格中删除该按钮。

另一个问题是,每次显示单元格时,您的代码都会添加一个新按钮,因此许多/大多数单元格中可能有多个按钮。

您需要重构代码,以便在 tableView:cellForRowAtIndexPath: 中添加一次按钮,并且仅针对新创建的单元格。

有两种方法可以做到这一点:

  1. 将“复杂”单元类型分为两种类型:已购买和未购买,并分别创建/出列它们。仅将按钮添加到未购买的单元格类型。

  2. 将按钮添加到“付费”部分的所有单元格中,并在购买商品后将其隐藏。

无论哪种情况,您都需要一种方法来获取指向按钮的指针。执行此操作的首选方法是使用 tag 属性,使其成为单行:

UIButton * button = [cell viewForTag:42];
...

您还可以遍历单元格的 subview 来查找 UIButton 对象:

UIButton *button = nil;

foreach (UIView *view in cell.subviews) {
if ([view isKindOfClass:[UIButton class]])
button = (UIButton *)view;
}

我建议使用常量标记来标识按钮,然后重写您的 buyNow: 方法,如下所示:

-(IBAction)buyNow:(id)sender {
UITableViewCell *cell = (UITableViewCell *)((UIView *)sender).superview;

int itemID = [tableView indexPathForCell:cell].row + 500;

...
}

关于iphone - iOS : UITableView reloadData not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682733/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com