UITableView附件按钮Segue无法正常工作

时间:2013-09-11 10:25:13

标签: ios uitableview

我在学习如何使用segue将数据从单元附件按钮传递到详细视图控制器时遇到大问题。如果我点击单元格,数据将传递到NSString *selectedItem;中的详细视图控制器,而另一个视图上的标签将更新为单元格中的单词 -

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
        {
    [self performSegueWithIdentifier:@"toDetail" sender:self];
        }

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
            if ([segue.identifier isEqualToString:@"toDetail"]) {
                NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
                DrugDetailViewController *destViewController = segue.destinationViewController;
                destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
            }
        }

我将故事板上的一个segue从单元格连接到详细视图,名称为“toDeatil”当我单击它进入详细信息屏幕的单元格时它会起作用,但如果我放了

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"toDetail" sender:self];
    }

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([segue.identifier isEqualToString:@"toDetail"]) {
            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
            DrugDetailViewController *destViewController = segue.destinationViewController;
            destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
        }
    }

几乎完全相同,但来自accessorybutton,当我点击单元格时,我将故事板上的segue从单元格accessorybutton连接到名称为“toDetail”的详细信息视图它进入细节屏幕,但信息不存在,标签剂量被填写或者只是一直使用第一个细胞细节。

我尝试了大量的组合。我已经尝试在自定义单元格中创建自己的附件按钮UIButton,但它只是始终使用第一个单元格细节。

目标是让didSelectRowAtIndexPath转到一个视图,accessoryButtonTappedForRowWithIndexPath转到另一个视图,但我需要告诉accessoryButtonTappedForRowWithIndexPath按下了哪个单元格。

希望这样做。

谢谢

4 个答案:

答案 0 :(得分:3)

您可以将indexPath作为sender传递给performSegueWithIdentifier来电,如下所示:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"toDetail" sender:indexPath];//IndexPath as sender
}

并使用prepareForSegue方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"toDetail"]) {
        //Detect sender class and act accordingly
        NSIndexPath *indexPath = [sender isKindOfClass:[NSIndexPath class]] ? (NSIndexPath*)sender : [self.tableView indexPathForSelectedRow];
        DrugDetailViewController *destViewController = segue.destinationViewController;
        destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
    }
}

答案 1 :(得分:3)

您无需实施 accessoryButtonTappedForRowWithIndexPath

从附件视图触发 prepareForSegue 时,发件人:( id)发件人参数设置为 UITableViewCell ,其中包含附件视图。然后,您可以向表视图询问该单元格的索引(而不是所选索引)。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"toDetail"] && [sender isKindOfClass:[UITableViewCell class]]) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
        DrugDetailViewController *destViewController = segue.destinationViewController;
        destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
    }
}

答案 2 :(得分:2)

这是因为[self.tableView indexPathForSelectedRow]仅在点击ROW时返回NSIndexPath,而不是在点击附件按钮时返回。

accessoryButtonTappedForRowWithIndexPath中,您需要手动将indexPath.row传递给prepareForSegue方法。试试这个:

NSInteger selectedRow;

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    selectedRow = indexPath.row;
    [self performSegueWithIdentifier:@"toDetail" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([segue.identifier isEqualToString:@"toDetail"]) 
    {
        DrugDetailViewController *destViewController = segue.destinationViewController;
        destViewController.selectedItem = [[candyArray objectAtIndex:selectedRow] name];
    }
}

答案 3 :(得分:0)

如果您在应用程序委托中选择了所选内容的状态,那该怎么办? Raul Juarez的回答是做的,但是发送者参数的目标是其他的!

我有一个使用UITableView的应用程序,我需要知道上面屏幕中附件按钮上触摸了什么项目!

为了管理这个场景,我在应用程序委托上有一个属性,当我触摸桌面视图附件按钮时我会更新;所以在下一个屏幕中,我可以检索读取应用程序代理属性的项目。

通常,我使用de application delegate代码模型应用程序(划分必要的类),因此视图实例只与此模型交互以更新必要的状态!我所做的是专注于独立于模型工作的观看工作!

也许有人这样:

// Property on Application Delegate
@propety (atomic,readwrite) NSIndexPath* indexTapped;

// Method on UITableViewDelegate instance
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    UIMyAppDelegate* model = (UIMyAppDelegate*)[[UIApplication shared] delegate];
    model.indexTapped = indexPath;
    [self performSegueWithIdentifier:@"toDetail" sender:self];
}

// Method on another View Controller
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UIMyAppDelegate* model = (UIMyAppDelegate*)[[UIApplication shared] delegate];
    if ([segue.identifier isEqualToString:@"toDetail"]) {
        NSIndexPath *indexTapped = model.indexSelected;
        DrugDetailViewController *destViewController = segue.destinationViewController;
        destViewController.selectedItem = [[candyArray objectAtIndex:[indexPath row]] name];
    }
}