When I select buttons within these UITableViewCells
, the button sometimes passes data from the wrong row. In this table view, there are 10 sections, each with a section header and with only 1 row. The row height takes up most of the screen, as there are 6 buttons within it. Each UIButton
, when selected, opens a new viewcontroller
with an enlarged view of the button's image (removed this code to make it more readable here).
当我在这些UITableViewCells中选择按钮时,按钮有时会从错误的行传递数据。在此表视图中,有10个部分,每个部分都有一个部分标题,只有一行。行高占据了屏幕的大部分,因为其中有6个按钮。选中后,每个UIButton都会打开一个新的viewcontroller,其中包含按钮图像的放大视图(删除此代码以使其更具可读性)。
Here is the problem: each button successfully pushes a modal viewcontroller
; however, as I scroll down, sometimes the buttons pass the data from the same button from the section below it (e.g. button1 in section 4 when clicked may pass the data for button1 in section 5). Similarly, as I scroll back up, sometimes the buttons pass the data from the same button from the section above it (e.g. button5 in section 7 when clicked may pass the data for button5 in section 6).
这是问题:每个按钮成功推送模态视图控制器;但是,当我向下滚动时,有时按钮会从同一按钮传递来自其下方部分的数据(例如,单击时第4部分中的按钮1可以传递第5部分中按钮1的数据)。类似地,当我向上滚动时,有时按钮从其上方的部分传递来自相同按钮的数据(例如,单击时第7节中的按钮5可以传递第6部分中按钮5的数据)。
I think this problem occurs because the iPhone is pulling the most recently loaded cell (when cellForRowAtIndexPath
is called), but I would like it to pass the data for the row in which the button is located.
我认为出现此问题是因为iPhone正在拉动最近加载的单元格(当调用cellForRowAtIndexPath时),但我希望它传递按钮所在行的数据。
Thoughts? Thanks in advance for any help you can provide.
思考?提前感谢您提供的任何帮助。
Edit: Added data code as requested
编辑:根据请求添加数据代码
- (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];
}
2 个解决方案
#1
1
yes you can get particular cell from which button is taped. write in your IBAction method and you will get particular cell taped button in indexPath object
是的,你可以从哪个按钮被贴上特定的单元格。写入您的IBAction方法,您将获得indexPath对象中的特定单元格录制按钮
UIView *senderButton = (UIView*) sender;
NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: (UITableViewCell*)[[senderButton superview]superview]];
hope this will help
希望这会有所帮助
#2
1
Sometimes its tagging problem.
有时它的标记问题。
Change the tag like this:
像这样更改标签:
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];
Working??
加工??
#1
1
yes you can get particular cell from which button is taped. write in your IBAction method and you will get particular cell taped button in indexPath object
是的,你可以从哪个按钮被贴上特定的单元格。写入您的IBAction方法,您将获得indexPath对象中的特定单元格录制按钮
UIView *senderButton = (UIView*) sender;
NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: (UITableViewCell*)[[senderButton superview]superview]];
hope this will help
希望这会有所帮助
#2
1
Sometimes its tagging problem.
有时它的标记问题。
Change the tag like this:
像这样更改标签:
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];
Working??
加工??