4

最初の TableViewController から 2 番目の TableViewController にデータを渡さずに、ある TableViewController から詳細開示ボタン (または行) を選択し、別の TableViewController に移動しようとしています。したがって、ほとんどの場合、最初の TableViewController は、選択された詳細開示ボタン (または行) に応じて異なる TableViewControllers に移動するテーブルとして機能します。

これまでのところ、これを行うための私のコードは次のようになります。

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {


    NSUInteger rowNumber = [indexPath row];   
    NSString *categoryCode = [self.categoryCodes objectAtIndex:rowNumber];

    self.categoryData = [self.commuterDict objectForKey:categoryCode];

    [self performSegueWithIdentifier:@"ShowPlaces" sender:self];
}

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

    if ([[segue identifier] isEqualToString:@"ShowPlaces"]) {

        PlacesViewController *placesViewController = [segue destinationViewController];

        // --> I believe I'm missing something here to access a specific row? <--



    }
}

誰かが私を助けてくれることを願っています!

4

5 に答える 5

2

tableView:accessoryButtonTappedForRowWithIndexPath: 関数の indexPath から特定の行を取得します。具体的には、タップされた行は indexPath.row でした。(テーブルに複数のセクションがある場合は、indexPath からセクションを読み取ることもできますが、単純なテーブルを使用しているだけのように思えます。)

現在の行を変数に保存し、それを prepareForSegue:sender で読み取って、どこに移動するかを選択できます。

于 2011-12-15T22:04:15.350 に答える
2

UIViewController のドキュメントには次のように書かれてい-prepareForSegue:sender:ます。

セグエは複数のソースからトリガーされる可能性があるため、セグエおよび送信者パラメーターの情報を使用して、セグエのコンテキストを定義し、適切な情報を渡すことができます。たとえば、セグエがテーブル ビューから発生した場合、sender パラメータは、ユーザーがタップしたテーブル ビュー セルを識別します。その情報を使用して、宛先のView Controllerにデータを設定できます。

それを考えると、最初にsenderパラメーターを見て、それが表のセルへのポインターであると予想します。セルを配置するテーブルがわかっている場合は、 を使用-indexPathForCell:してセルのインデックス パスを取得できます。

于 2012-01-01T01:30:28.337 に答える
0

セグエの準備で使用する送信者は、何でもかまいません。行を知りたい場合は、行またはインデックス パスを送信します。

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {


    NSUInteger rowNumber = [indexPath row];   
    NSString *categoryCode = [self.categoryCodes objectAtIndex:rowNumber];

    self.categoryData = [self.commuterDict objectForKey:categoryCode];

    [self performSegueWithIdentifier:@"ShowPlaces" sender:indexPath];
}

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

    if ([[segue identifier] isEqualToString:@"ShowPlaces"]) {

        PlacesViewController *placesViewController = [segue destinationViewController];

        // Row information is supplied as the sender
        NSIndexPath *indexPath = sender;


    }
}

実際の行を使用する場合は、それを送信者にします

[self performSegueWithIdentifier:@"ShowPlaces" sender:[tableView cellForRowAtIndexPath:indexPath]];
于 2012-08-09T19:16:56.583 に答える
0

送信者オブジェクトが tableviewcell の場合、次のコード スニペットが機能するはずです。

NSIndexPath *indexPath = [[[segue sourceViewController] tableView] indexPathForCell:sender];

それ以外の場合は試してください

NSIndexPath *indexPath = nil;
if ([sender isMemberOfClass:[UITableViewCell class]]) 
{
    indexPath = [[[segue sourceViewController] tableView] indexPathForCell:sender]; 
}
else if ([[sender superview] isMemberOfClass:[UITableViewCell class]])
{
    indexPath = [[[segue sourceViewController] tableView] indexPathForCell:(UITableViewCell *)[sender superview]];
}
else if ([[[sender superview] superview] isMemberOfClass:[UITableViewCell class]])
{
    indexPath = [[[segue sourceViewController] tableView] indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
}
于 2012-01-06T12:55:45.043 に答える