2013-09-07 8 views
11

私はiOS App Developmentを初めて使用しています。私は、私がdidSelectRowAtIndexPathを使用して別のUIViewControllerを取得する行のいずれかを選択するように、tableviewコントローラを接続しました。 didSelectRowAtIndexPathが呼び出された行のインデックスを表示しているこのUIViewController内のコンテナビューがあります。私はsegueを使ってこれを行いたいのですが、問題はコンテナビューを使用して作成されたビューコントローラへの参照を取得する方法がわかりません。私はprepareForSegueでsegue.destinationViewControllerを使用して目的のView Controllerを取得できますが、コンテナビューのために読み込まれるView Controllerへの参照を取得するにはどうすればよいですか。私はiOS 6用のアプリケーションを構築しています。また、UI用にStoryboardを使用しました。おかげコンテナビューのビューへの参照を取得する

編集:

この質問は基本的にダウンのUIViewController-2のUIViewController-1の内部にあるUIContainerViewで指示されているへの参照を取得する方法に出ました。 UIViewController-1は、UITableViewControllerの行を選択することによってトリガーされます。

UITableViewController(与える行を選択します)---> ContainerView ---> UIViewController-2(ContainerViewに関連付けられたViewController )。

+0

ここに回答があるようです:http://stackoverflow.com/a/ 18673394/1187415。私はそれが@Mundiが以下に述べたものと同じものかどうか疑問に思います。 –

+0

同じ質問を2回転記しないでください。私はこのスレッドを複製として閉じたいと思っています。 –

+1

@DuncanC私はもう1つを閉じようと思っています。これはこの複製と同じです。これは最初のものでした(より明示的です)。 – Rob

答えて

26

[OK]を、のはこのシナリオを想像してみましょう:

storyboard

そして、あなたがモデルデータを使用すると、テーブルの上にタップ電池をバックアップしている「第2のビューコントローラの子」のラベルを更新したいと仮定しましょうビュー。あなたは何ができるか

は次のとおりです。

  1. は、最初のシーンから二番目の一意の識別子(例えばDetail)へのセグエを付けて、渡された値を受け取るために、第2のビューコントローラでプロパティを定義しますそれには(例えばsomeStringValue)、値を渡すprepareForSegueと書く。:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    { 
        if ([segue.identifier isEqualToString:@"Detail"]) 
        { 
         NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
         [segue.destinationViewController setSomeStringValue:self.objects[indexPath.row]]; 
        } 
    } 
    
  2. 繰り返します埋め込みセグエのためのこのプロセスは、すなわち、値を受け取るためにビューコントローラを独自のユニークな識別子をセグエあなたの埋め込みを与える(例えばEmbed)とその「第2のビューコントローラの子」でプロパティを作成します(例えばsomeStringValue)がそれに渡され、その子ビューコントローラに沿って値を渡します2番目のビューコントローラで、例えば、prepareForSegueを持っています。他の一つは、上書きすることができます言ったように

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    { 
        if ([segue.identifier isEqualToString:@"Embed"]) 
        { 
         [segue.destinationViewController setSomeStringValue:self.someStringValue]; 
        } 
    } 
    
+0

が封じ込められているのでしょうか? – Mrug

+0

@Mrug次に、prepareForSegueで子プロパティを設定するのではなく、アプローチはまったく同じです。プログラマチックにインスタンスを作成するコードで行います。子を呼び出し、 'addChildViewController'を呼び出します。 – Rob

1

あなたは約prepareForSegueです。 destinationViewControllerは、宛先ビューコントローラを提供します。

他に何が必要なのかわかりません。宛先コントローラーに別のコントローラー(なぜ?)を含める場合は、宛先コントローラーにそのコントローラーを指す@propertyを与え、このプロパティーを読み取り、設定することができます。

しかし、質問は残っています - なぜあなたはそれをしたいですか?

+0

私は別のビューを表示するためにコンテナを使用しています。このビューは実際にはデフォルトのナビゲーションバーに色合いの効果があるので、実際にはナビゲーションバーとして機能します(これは私が好きではありません)。私が聞いた質問は、タイトルを設定することです(これは新しいビューのラベルになります)。なぜ、 – Roadblock

-1

セル再利用識別子を宣言して使用するこのメソッド。

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

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

      } 


    } 

訪問の複数の基準については、以下のリンクを

Here

0

あなたがやっているすべては、コンテナのビューを使用して、その後、模擬ナビゲーションバーを作成して、子ビューコントローラは、不必要に複雑かつメモリ - である場合インテンシブ。ビューコントローラー1のビューとしてシミュレートされたナビゲーションバーを作成し、タイトルを含むラベルを付け、ラベルをアウトレットとして接続し、ラベルを必要に応じて設定します。ずっと、はるかにクリーンでシンプルです。

4

prepareForSegueは、子ビューコントローラを検索します - あなたが埋め込まれたセグエはすなわち

-(void)viewDidLoad { 
    for (UIViewController* vc in self.childViewControllers) { 
      if ([vc isKindOfClass:MyChildController.class]) { 
       // do something here 
      } 
    } 
} 

は、あなたがそれを行う示唆はないが、あなたは絵コンテで作業している場合に発生するとき以外の時間にそれにアクセスできるよう個人的に私はUIViewController.childControllersを使用して好みますchildControllers配列の順序は、インターフェースビルダーの順序とまったく同じですので、childViewControllers [0]、[1]を直接参照することができます。

関連する問題