我的应用程序的Feed由UITableViewController管理,我在其中设置自定义单元格,这些单元格是UITableViewCell子类的实例。
该子类的一个属性是名为flameRelation的UIButton:
@property (weak) IBOutlet UIButton* flameRelation;
我正在根据发件人的类创建到详细视图控制器的动态segue。如果发送者是单元本身,我将一组给定的数据传递给我的详细视图控制器。如果发件人是flameRelation按钮,我会传递另一个。
为实现这一目标,我正在研究以下两步法:
1)由于我需要知道按下FlameRelation按钮的单元格的indexpath.row,我在UITableView方法中设置了该按钮的标记,该方法设置了我的Feed的每个单元格如下:
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//Set a bunch of things before setting UIButton flameRelation tag
[cell.flameRelation setTag:indexPath.row];
我正在打印标签,这样我可以在启动构建后向下滚动我的Feed时检查标签是否已设置(我看到数字递增,因为我按预期向下滚动)。
NSLog(@"The button tag for this cell is set to %ld",(long)[cell.flameRelation tag]);
2)在prepareForSegue方法中,允许用户使用相关信息转换到详细视图控制器,我首先测试发送者的类。如果发件人的类是UIButton,我会尝试通过将indexpath的值设置为标记的值来将正确的信息传递给详细视图控制器:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"FlameDetail"]) {
FlameDetailViewController* flameDetailController = (FlameDetailViewController*) segue.destinationViewController;
if ([sender isKindOfClass:[FlameCellTableViewCell class]])
{
NSIndexPath* indexPath = [self.tableView indexPathForCell:sender];
NSLog(@"The indexPath is: %@", indexPath);
flameDetailController.flame = [self.feed flameAtIndex:indexPath.row];
NSLog(@"class for object sender: %@", NSStringFromClass([sender class]));
}
else if ([sender isKindOfClass:[UIButton class]])
{
NSLog(@"The button tag is set to %ld",(long)[sender tag]);
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0];
NSLog(@"The indexPath from UIButton is: %@", indexPath);
flameDetailController.flame = [self.feed flameAtIndex:indexPath.row];
NSLog(@"The value of indexPath.row is %ld",(long)indexPath.row);
NSLog(@"class for object sender: %@", NSStringFromClass([sender class]));
flameDetailController.findOutView.hidden = NO;
[flameDetailController.flameAction setTitle:@"CHAT NOW" forState:UIControlStateNormal];
NSLog(@"Yes, the sender is UIButton");
NSLog(@"The title of flameAction is set to %@", flameDetailController.flameAction.titleLabel.text);
}
}
如果我点击单元格本身,一切都运行良好,但是如果我点击flameRelation按钮,我会在日志中看到标签上的getter返回0.这显然没有将正确的信息传递给我的目标查看控制器。
谢谢!
答案 0 :(得分:0)
首先,为什么要将代码值转换为indexPath
,然后使用行号获取模型数据?
您的代码:
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0];
flameDetailController.flame = [self.feed flameAtIndex:indexPath.row];
请改为尝试:
flameDetailController.flame = [self.feed flameAtIndex:sender.tag];
我没有看到为什么这种方法不起作用的原因。如果不是,则需要共享更多代码/详细信息。
但是,我想建议另一个替代方案(尽管不是很好):
UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
NSIndexPath *clickedButtonPath = [self.tableView indexPathForCell:clickedCell];