获取用于在 prepareForSegue 中编辑行的索引路径?

get index path for editing row in prepareForSegue?

我正在呈现来自 UITableView 的弹出窗口并使用 prepareForSegue 方法,如 WWDC 2014 中所讨论的“View Controller iOS8 的进步”

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

UINavigationController * nvc = segue.destinationViewController;
UIPopoverPresentationController * pvc = nvc.popoverPresentationController;
pvc.delegate = self;
}

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
return UIModalPresentationNone;
}

问题是,我需要将一个值从已编辑的行传递到弹出框。有没有办法干净地做到这一点,例如(我知道它不存在,但是)

[self.myTableView indexPathForEditingRow];

我试过了

[self.myTableView indexPathForSelectedRow];

但是这个 returns table 中的第一行。

看看你的 sender 是谁。如果它是一个细胞,那么你就拥有了你所需要的一切。 如果没有,你需要制作一个属性并记住tableView委托的didSelectCell方法中的索引路径。

尝试:

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
NSLog(@"Riga selezionata: %ld",(long)[indexPath row]);

如果您从 table 视图调用 performSegueWithIdentifier,您可以发送 indexPath。

[self performSegueWithIdentifier:@"identifier" sender:(NSIndexPath *)indexPath];

然后你可以调用prepareForSegue,你需要一个暴露的方法或者属性来设置popover上的indexPath

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(NSIndexPath *)indexPath
{
     if ([segue.identifier isEqualToString:@"identifier"])
     {
         UINavigationController * nvc = segue.destinationViewController;
         UIPopoverPresentationController * pvc = nvc.popoverPresentationController;
         //added property
         pvc.indexPath = indexPath;
         pvc.delegate = self;
     }
}

您可以使用此 UITableView 扩展程序:

extension UITableView {

    var indexPathForEditingRow: NSIndexPath? {
        return indexPathsForEditingRows.first
    }

    var indexPathsForEditingRows: [NSIndexPath] {
        return visibleCells.flatMap { cell -> NSIndexPath? in
            guard let indexPath = indexPathForCell(cell) where cell.editingStyle != .None else {
                return nil
            }
            return indexPath
        }
    }

}