-1

当我选择其中UITableViewCells的按钮时,按钮有时会从错误的行传递数据。在这个表视图中,有 10 个部分,每个部分都有一个部分标题并且只有 1 行。行高占据了屏幕的大部分,因为其中有 6 个按钮。每个UIButton,当被选中时,会打开一个新viewcontroller的按钮图像的放大视图(删除此代码以使其在此处更具可读性)。

问题来了:每个按钮都成功推送了一个 modal viewcontroller;但是,当我向下滚动时,有时按钮会从它下面的部分传递来自同一按钮的数据(例如,当单击第 4 部分中的 button1 时,可能会传递第 5 部分中 button1 的数据)。同样,当我向上滚动时,有时按钮会从其上方部分的同一按钮传递数据(例如,当单击第 7 部分中的 button5 时,可能会传递第 6 部分中 button5 的数据)。

我认为出现此问题是因为 iPhone 正在拉动最近加载的单元格(何时cellForRowAtIndexPath被调用),但我希望它传递按钮所在行的数据。

想法?提前感谢您提供的任何帮助。

编辑:按要求添加数据代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

// dataDict pulled from plist    
NSDictionary *button1Dict = [dataDict objectForKey:@"button1"];
NSDictionary *button2Dict = [dataDict objectForKey:@"button2"];
NSDictionary *button3Dict = [dataDict objectForKey:@"button3"];
NSDictionary *button4Dict = [dataDict objectForKey:@"button4"];
NSDictionary *button5Dict = [dataDict objectForKey:@"button5"];
NSDictionary *button6Dict = [dataDict objectForKey:@"button6"];

// selectedCatTag and selectedItemTag for each button are alloc and init in viewDidLoad
button1SelectedCatTag = (NSUInteger *)[[button1Dict objectForKey:@"selectedCatTag"] integerValue];
button2SelectedCatTag = (NSUInteger *)[[button2Dict objectForKey:@"selectedCatTag"] integerValue];
button3SelectedCatTag = (NSUInteger *)[[button3Dict objectForKey:@"selectedCatTag"] integerValue];
button4SelectedCatTag = (NSUInteger *)[[button4Dict objectForKey:@"selectedCatTag"] integerValue];
button5SelectedCatTag = (NSUInteger *)[[button5Dict objectForKey:@"selectedCatTag"] integerValue];
button6SelectedCatTag = (NSUInteger *)[[button6Dict objectForKey:@"selectedCatTag"] integerValue];

button1SelectedItemTag = (NSUInteger *)[[button1Dict objectForKey:@"selectedItemTag"] integerValue];
button2SelectedItemTag = (NSUInteger *)[[button2Dict objectForKey:@"selectedItemTag"] integerValue];
button3SelectedItemTag = (NSUInteger *)[[button3Dict objectForKey:@"selectedItemTag"] integerValue];
button4SelectedItemTag = (NSUInteger *)[[button4Dict objectForKey:@"selectedItemTag"] integerValue];
button5SelectedItemTag = (NSUInteger *)[[button5Dict objectForKey:@"selectedItemTag"] integerValue];
button6SelectedItemTag = (NSUInteger *)[[button6Dict objectForKey:@"selectedItemTag"] integerValue];

UIButton *button1 = (UIButton *)[cell viewWithTag:1];
UIButton *button2 = (UIButton *)[cell viewWithTag:2];
UIButton *button3 = (UIButton *)[cell viewWithTag:3];
UIButton *button4 = (UIButton *)[cell viewWithTag:4];
UIButton *button5 = (UIButton *)[cell viewWithTag:5];
UIButton *button6 = (UIButton *)[cell viewWithTag:6];

CGFloat kImageSquareSideLength = 100.0;

if (button1Dict) {
    NSDictionary *selectedCatDict = [dataCategories objectAtIndex:(int)button1SelectedCatTag];
    NSString *imageName = [[selectedCatDict objectForKey:@"itemImages"] objectAtIndex:(NSUInteger)button1SelectedItemTag];
    [button1 setImage:[[UIImage imageNamed:imageName] imageByScalingAndCroppingForSize:CGSizeMake(kImageSquareSideLength, kImageSquareSideLength)] forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(button1Pressed:) forControlEvents:UIControlEventTouchUpInside];
}
if (button2Dict) {
    NSDictionary *selectedCatDict = [dataCategories objectAtIndex:(int)button2SelectedCatTag];
    NSString *imageName = [[selectedCatDict objectForKey:@"itemImages"] objectAtIndex:(NSUInteger)button2SelectedItemTag];
    [button2 setImage:[[UIImage imageNamed:imageName] imageByScalingAndCroppingForSize:CGSizeMake(kImageSquareSideLength, kImageSquareSideLength)] forState:UIControlStateNormal];
    [button2 addTarget:self action:@selector(button2Pressed:) forControlEvents:UIControlEventTouchUpInside];
}
if (button3Dict) {
    NSDictionary *selectedCatDict = [dataCategories objectAtIndex:(int)button3SelectedCatTag];
    NSString *imageName = [[selectedCatDict objectForKey:@"itemImages"] objectAtIndex:(NSUInteger)button3SelectedItemTag];
    [button3 setImage:[[UIImage imageNamed:imageName] imageByScalingAndCroppingForSize:CGSizeMake(kImageSquareSideLength, kImageSquareSideLength)] forState:UIControlStateNormal];
    [button3 addTarget:self action:@selector(button3Pressed:) forControlEvents:UIControlEventTouchUpInside];
}
if (button4Dict) {
    NSDictionary *selectedCatDict = [dataCategories objectAtIndex:(int)button4SelectedCatTag];
    NSString *imageName = [[selectedCatDict objectForKey:@"itemImages"] objectAtIndex:(NSUInteger)button4SelectedItemTag];
    [button4 setImage:[[UIImage imageNamed:imageName] imageByScalingAndCroppingForSize:CGSizeMake(kImageSquareSideLength, kImageSquareSideLength)] forState:UIControlStateNormal];
    [button4 addTarget:self action:@selector(button4Pressed:) forControlEvents:UIControlEventTouchUpInside];
}
if (button5Dict) {
    NSDictionary *selectedCatDict = [dataCategories objectAtIndex:(int)button5SelectedCatTag];
    NSString *imageName = [[selectedCatDict objectForKey:@"itemImages"] objectAtIndex:(NSUInteger)button5SelectedItemTag];
    [button5 setImage:[[UIImage imageNamed:imageName] imageByScalingAndCroppingForSize:CGSizeMake(kImageSquareSideLength, kImageSquareSideLength)] forState:UIControlStateNormal];
    [button5 addTarget:self action:@selector(button5Pressed:) forControlEvents:UIControlEventTouchUpInside];
} 

if (button6Dict) {
    NSDictionary *selectedCatDict = [dataCategories objectAtIndex:(int)button6SelectedCatTag];
    NSString *imageName = [[selectedCatDict objectForKey:@"itemImages"] objectAtIndex:(NSUInteger)button6SelectedItemTag];
    [button6 setImage:[[UIImage imageNamed:imageName] imageByScalingAndCroppingForSize:CGSizeMake(kImageSquareSideLength, kImageSquareSideLength)] forState:UIControlStateNormal];
    [button6 addTarget:self action:@selector(button6Pressed:) forControlEvents:UIControlEventTouchUpInside];
} 

return cell;

}

//all other button actions are identical to button1Pressed
- (IBAction)button1Pressed:(id)sender
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
SelectedItemViewController *destVC = [storyboard instantiateViewControllerWithIdentifier:@"SelectedItemViewController"];

destVC.selectedOutfitDict = @"DiscoverOutfits";
destVC.selectedCatTag = (int *)button1SelectedCatTag;
destVC.selectedItemTag = (int *)button1SelectedItemTag;

[self presentViewController:destVC animated:NO completion:nil];
}
4

2 回答 2

1

是的,您可以从粘贴按钮的特定单元格中获取。写入您的 IBAction 方法,您将在 indexPath 对象中获得特定的单元格录音按钮

UIView *senderButton = (UIView*) sender;
       NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: (UITableViewCell*)[[senderButton superview]superview]];

希望这会有所帮助

于 2013-01-23T06:12:42.410 回答
1

有时它的标记问题。

像这样更改标签:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

   UIButton *button1 = [[UIButton alloc] init];
   button1.tag = indexPath.section +  indexPath.row + 8956;// 8956 is some random weird     number
  [cell.contentView addSubview:button1];
  [button1 release];

// same code for other buttons

}

UIButton *button1 = (UIButton *)[cell.contentView viewWithTag: indexPath.section +  indexPath.row + 8956];
UIButton *button2 = (UIButton *)[cell.contentView viewWithTag: indexPath.section + indexPath.row +8956];
UIButton *button3 = (UIButton *)[cell.contentView viewWithTag: indexPath.section + indexPath.row +8956];
UIButton *button4 = (UIButton *)[cell.contentView viewWithTag: indexPath.section + indexPath.row +8956];
UIButton *button5 = (UIButton *)[cell.contentView viewWithTag: indexPath.section + indexPath.row +8956];
UIButton *button6 = (UIButton *)[cell.contentView viewWithTag: indexPath.section + indexPath.row +8956];

在职的??

于 2013-01-23T06:42:54.063 回答