3

我已经有一段时间没有做过任何 iOS 编程了,所以请原谅我这个简单的问题。我已经搜索过了,也许我只是在想这个。

我有一个名为 ShowStreamDetails 的 segue,将动态原型单元格连接到一个详细视图,该视图显示...所选单元格的详细信息。现在我不知道细节披露按钮会很麻烦。如果我选择单元格,它会正常工作并将对象传递到详细视图。如果我按下详细信息披露指示器,它将转到详细信息视图,然后该视图显示列表中的第一项,而不是单元格中列出的实际项目。所以,这就是我所拥有的。

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

和准备继续:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([[segue identifier] isEqualToString:@"ShowStreamDetails"]) 
    {
        StreamsDetailViewController *detailViewController = [segue destinationViewController];

        detailViewController.streams = [self.dataController objectInListAtIndex:[self.tableView indexPathForSelectedRow].row];
    }
}

如何将其添加到 prepareForSegue: 以便它传递正确的信息?

4

3 回答 3

1

我刚刚遇到了这个问题,并设法弄清楚 sender 参数是用于详细披露的 UITableView 单元格。

所以只要做这样的事情:

UITableViewCell* cell = (UITableViewCell*)sender;
IndexPath* iPath = [self.tableView indexPathForCell: cell];
于 2013-04-02T08:15:33.670 回答
1

@voidref 有正确的想法。

问题是当用户点击详细信息披露按钮时,单元格没有被选中。所以-indexPathForSelectedRow返回 nil,对于数组索引,它被视为零。

相反,您想找到其披露按钮触发了 segue 的单元格的索引路径。因此,您的第二个代码块应如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([[segue identifier] isEqualToString:@"ShowStreamDetails"]) 
    {
        StreamsDetailViewController *detailViewController = [segue destinationViewController];

        detailViewController.streams = [self.dataController objectInListAtIndex:[self.tableView indexPathForCell:sender].row];
    }
}

此外,与您的原始问题没有直接关系,但您不需要实施-tableView:accessoryButtonTappedForRowWithIndexPath:. 相反,只需在情节提要中将原型单元格的附件类型设置为 Detail Disclosure,然后从原型单元格中的附件按钮控制/双指/右键拖动到详细视图控制器,然后将生成的 segue 命名为“ShowStreamDetails”。

即使附件按钮可以说是“发送者”,sender参数也会自动设置为表格视图单元格。

于 2014-11-12T01:14:04.397 回答
0

斯威夫特版本:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let shooterController = segue.destination as? UIShooterViewController {
        if let cell = sender as? UITableViewCell, let indexPath = tableView.indexPath(for: cell) {
            let matchShooter = fetchedResultsController.object(at: indexPath)
            shooterController.setEntity(matchShooter.shooter, new: false)
        }
    }
}

发件人包含点击了披露指示符的单元格。

于 2018-01-03T10:53:52.420 回答