UIButton标记值未在UITableViewController中的prepareForSegue方法中传递

时间:2015-10-02 02:59:29

标签: ios objective-c iphone uitableview uibutton

我的应用程序的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.这显然没有将正确的信息传递给我的目标查看控制器。

谢谢!

1 个答案:

答案 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];