3

私の問題: ユーザーが特定のセルでプレーヤーを選択するとき、そのプレーヤーに関連する残りの情報を新しいビュー コントローラーに表示したい

これまでのところ、私の方法は次のようになります。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath
{
IPlayerViewController *detailViewController = [[IPlayerViewController alloc] initWithNibName:@"IPlayerViewController.h" bundle:nil];
Player *playerF = [playerArray objectAtIndex:indexPath.row];
detailViewController.PlayerLabel.text=playerF.Name;

[self.navigationController pushViewController:detailViewController animated:YES];

}

ただし、IPlayerViewController で作成した (そして UILabel をストーリーボードのラベルに接続した) PlayerLabel は空白です。

これがおなじみのように見える場合は、次のチュートリアルに従っているが、独自のものを追加しようとしているためです。どうもありがとう! http://www.raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1

編集:ストーリーボードを使用しています。ただし、事前定義されたメソッドでは、xcode に次のコメントが付属しており、Nib Name で初期化されていました。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath
{
   // Navigation logic may go here. Create and push another view controller.
/*
 <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
 // ...
 // Pass the selected object to the new view controller.
 [self.navigationController pushViewController:detailViewController animated:YES];
 */

}

したがって、prepareForSegue を使用する必要があるようです。これは didSelectRowAtIndexPath で呼び出すものですか、それともそのメソッドを無視しますか?

4

3 に答える 3

4

ストーリーボードを使用している場合、ほとんどの場合、 への呼び出しは表示されません-tableView:didSelectRowAtIndexPath:。次のビューに移動するためにセグエを使用している場合は、次を-prepareForSegue:sender:参照してください: How to pass prepareForSegue: an objectを使用する必要があります。


アップデート

テーブル ビュー セルから詳細ビュー コントローラーへのセグエはありますか?

セグエがある場合、それ-tableView:didSelectRowAtIndexPath:はあなたが望むものではありません。セグエがある場合は-prepareForSegue:sender:、テーブル ビュー コントローラーでメソッドを作成します。次のようになります。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    Player *player = [self.playerArray objectAtIndex:indexPath.row];

    IPlayerViewController *destination = segue.destinationViewController;
    destination.player = player;
}

もちろん、IPlayerViewController に player プロパティがあると仮定します。

それが役立つことを願っています。

于 2012-08-01T20:17:59.363 に答える
0

次のビュー controller.h では、プレイヤー プロパティが必要です。

@property (nonatomic,strong) Player *player;

ストーリーボードを使用している場合は、selectedRow インデックスをクラスに保存し、次のように prepareForSegue メソッドを実装する必要があります。

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

  NextViewController *controller = segue.destinationViewController
  controller.player = [self.players objectAtIndex: YOUR_SAVED_INDEX];
}

コンセプトはわかりましたか?

于 2012-08-01T20:20:07.470 に答える
0

あなたはペン先で開始しているので、ストーリーボードを使用していないと思います....

まだロードされていないため、名前をラベルに直接入れようとしないでください。名前を保持する単なる文字列である詳細コントローラーにプロパティを作成します。コードでそれを設定、詳細コントローラーでdidSelectRowAtIndexPath:ラベルを更新します。viewDidLoad:

于 2012-08-01T20:20:13.920 に答える