11

以下のコードでは、 から に直接セグエを設定しようとしてUIViewControllerDetailViewControllerます。私は通常、からのセグエを行いUITableViewCellます(より明確だと思います)が、今回は、ViewController使用から直接行ってみたかっただけです-tableView:didSelectRowAtIndexPath:

私の質問は次のとおりです。ソリューションUITableViewCell indexPath内の fromにアクセスする必要がある状況に到達したのは、 viaを送信することでした。通常、送信者をここに設定します。周りを見回しましたが、これへの参照が見つかりません。送信者を使用してindexPathを渡すことが許容されるかどうかに興味がありますか? 私はそれが確かであると確信しており、以前どこかでできることを読んだことがあると確信していますが、今はそれへの参照を見つけることができません.-prepareForSegue:sender:indexPathsenderself

// ------------------------------------------------------------------- **
// DELEGATE: UITableView
// ------------------------------------------------------------------- **
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    [self performSegueWithIdentifier:@"SEGUE_TWO" sender:indexPath];
}

// ------------------------------------------------------------------- **
// SEGUE: ViewController_ONE > DetailViewController
// ------------------------------------------------------------------- **
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    if([[segue identifier] isEqualToString:@"SEGUE_TWO"]) {
        NSUInteger cellRow = [(NSIndexPath *)sender row];
        DetailViewController *destinationController = [segue destinationViewController];
        [destinationController setDataString:[[self dataList] objectAtIndex:cellRow]];
    }
}

編集:この場合、私が探していたのは

NSIndexPath *indexPath = [[self tableView] indexPathForSelectedRow]; 

基本的に、送信者パラメータを介して渡す必要なしにindexPath入る方法( )-performForSegue:sender:-performSegueWithIdentifier:sender:

4

2 に答える 2

30

は通常、送信者 in を使用することを避けていprepareForSegue:ます。これにより、送信者が期待しているものであると主張することが、より面倒で壊れやすくなります。また、セグエ名ではなく、destinationViewController オブジェクトのクラスを確認することを好みます。機能は、セグエのタイトルではなく、オブジェクト (またはより具体的にはそのインターフェイス) に関連付けられているため、クラスをチェックすると、何を達成しようとしているのかが明確になります。

以下は、UITableView. destinationViewController が nav コントローラーに埋め込まれているかどうかを常に確認し、オブジェクトのクラスも確認して、正しく処理していることを確認する必要があることに注意してください。最後に、アサートを使用して、処理を忘れた新しいセグエをどこかに追加していないことを確認します。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // unwrap the controller if it's embedded in the nav controller.
    UIViewController *controller;
    UIViewController *destVC = segue.destinationViewController;
    if ([destVC isKindOfClass:[UINavigationController class]]) 
    {
        UINavigationController *navController = (UINavigationController *)destVC;
        controller = [navController.viewControllers firstObject];
    } 
    else 
    {
        controller = destVC;
    }

    if ([controller isKindOfClass:[DetailViewController class]]) 
    {
        DetailViewController *vc = (DetailViewController *)controller;
        NSIndexPath *ip = [self.tableView indexPathForSelectedRow];
        [vc setDataString:[[self dataList] objectAtIndex:ip.row]];

    } 
    else 
    {
        NSAssert(NO, @"Unknown segue. All segues must be handled.");
    }

}
于 2013-03-14T16:06:38.873 に答える
10

UITableViewのメソッドを使用できますindexPathForCell。tableViewインスタンス変数があるといいのですが。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([sender isKindOfClass:[UITableViewCell class]]) {
        NSIndexPath * indexPath = [self.tableView indexPathForCell:sender];
        //Your code here
    }
}
于 2013-03-14T16:08:15.330 に答える