0

我在学习如何将数据从单元格附件按钮传递到带有 segues 的详细视图控制器时遇到了很大的问题。如果我点击单元格,则数据将传递到 a 中的详细视图控制器, 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从单元格连接到名称为“toDeutil”的详细信息视图当我单击单元格时它会进入详细信息屏幕,但是如果我把

- (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当我单击单元格时,它转到详细信息屏幕,但信息不存在,标签dosent得到填写或始终使用第一个单元格详细信息。

我已经尝试了很多组合。我尝试UIButton在自定义单元格中制作自己的附件按钮,但它始终只使用第一个单元格的详细信息。

目标是didSelectRowAtIndexPath进入一个视图并accessoryButtonTappedForRowWithIndexPath进入另一个视图,但我需要知道accessoryButtonTappedForRowWithIndexPath按下了哪个单元格。

希望这是有道理的。

谢谢

4

4 回答 4

3

您可以将indexPathas传递senderperformSegueWithIdentifier调用,如下所示:

- (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];
    }
}
于 2013-09-11T15:30:33.080 回答
3

您不需要实现accessoryButtonTappedForRowWithIndexPath

当从附件视图触发prepareForSegue时, sender:(id)sender参数设置为包含附件视图的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];
    }
}
于 2016-01-29T22:11:35.183 回答
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];
    }
}
于 2013-09-11T15:50:07.860 回答
0

怎么样,如果您驱动在应用程序委托上选择的内容的状态!Raul Juarez 的答案是做的,但是 sender 参数的对象是其他的!

我有一个使用 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];
    }
}
于 2014-05-18T09:05:41.500 回答