2011-11-07 13 views
19

でデリゲートを設定する方法、あなたは私を助けることができると思います。私は主にストーリーボードを使用してアプリケーションを作成してきた私は今しばらくの間、これで議論してきたストーリーボード

、私は新しいレコードを追加するために、モーダルボックスをポップアップポイントを持って、ポップアップは問題はそれを却下され、正常に動作します。

デモを使用してモーダルボックスを適切に閉じる方法についてはAppleの指示に従っていますが、アドオンプロセスには2つのステップ(ここではfullscreen)が必要なので、モーダルボックスにナビゲーションコントローラを追加する必要があります。

enter image description here

問題はので、ここで、デリゲートを設定することにある私の二つの質問です:私のルートビュークラス(Myタブ)で

1-追加クラス(モーダル)のデリゲートであります

:、すべてが右この以外に設定されています
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 
     [[segue destinationViewController] setDelegate:self]; 

    } 
} 

問題は、[segue destinationViewController]がAddDrinkViewControllerクラス(ストーリーボードを参照)ではなく、ナビゲーションコントローラを返していることにあります。これをどうやって回避するのですか?ナビゲーションコントローラを完全に削除すると、コードは適切なデリゲートを適切に設定して動作します。

2 - ストーリーボードにコンセントをドラッグして、デリゲートを設定する方法はありますか?

ありがとう!

+0

私は、モーダルのデリゲートを設定する方法についてはどこでも検索してきました。そのコードのためにありがとう。ハハ – MattAitchison

答えて

13

そうだね、destinationViewControllerは、この場合にはUINavigationControllerなります。私はこの一般的な状況に対処するために、カテゴリを書いた:

// category .h file 
@interface UIStoryboardSegue (NavControllerExtensions) 
// Gets destinationViewCotroller. But if that controller 
// is a NavigationController, returns the nav controller's 
// top level view controller instead. 
@property (readonly) id topLevelDestinationViewController; 
@end 

// category .m file 
@implementation UIStoryboardSegue (NavControllerExtensions) 
- (id)topLevelDestinationViewController 
{ 
    id dest = self.destinationViewController; 
    if ([dest isKindOfClass:[UINavigationController class]]) { 
    UINavigationController* nav = dest; 
    dest = nav.topViewController; 
    } 
    return dest; 
} 
@end 

は、だから今はちょうどさえNavigationControllerが存在するかどうかを心配する必要があなたのprepareForSegueのいずれかの方法でこれを行う、とすることはできません。

[[segue topLevelDestinationViewController] setDelegate:self] 
// another example: 
MyViewController *vc = segue.topLevelDestinationViewController; 
vc.delegate = self; // etc. 

あなたの2番目の質問に答えるために、私は、IB内のデリゲートを設定する方法を見つけることができませんでした。

9

私は(あなたと同じ)私の場合には短い方法を見つけた:

AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0]; 
+1

ニース!魅力のような私の問題を解決! – iDroid

+0

パーフェクトは、同様に私の問題を解決しました。私は同じナビゲーションコントローラではなく、別のものを使用するものを使用する他のviewControllersのプロパティを参照することができ理由を理解できませんでした。ピー! –

+0

ニース。これは私のためのトリックでした。スマートなソリューション。 –

4

基本的にあなたがUINavigationControllerの
インスタンスを作成し、
それにdestinationViewControllerを割り当て、その上面図コントローラ

を取得する必要があり
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 

    UINavigationController *navigationController = segue.destinationViewController; 
    AddDrinkViewController *addDrinkcontroller = (AddDrinkViewController *)navigationController.topViewController; 

    addDrinkcontroller.delegate = self; 

    } 
} 
関連する問題