2012-03-23 10 views
7

概要パスデータ

私は以下に添付PIC 2つのに示すように、ナビゲーションコントローラを含むiOSのプロジェクトを持っています。

AAAからCCCへの接続にはいくつかのデータを渡したいが、AAAとCCCの間にはナビゲーションコントローラがある。

enter image description here

Appleのドキュメントによると、UINavigationControllerは、サブクラス化してはならないので、私は、デリゲートを作成し、データを渡すことはできません。

質問:

  • 私はAAAからCCCにデータを渡すことができますか?
  • これを達成するための回避策はありますか?
+0

なぜAAAとCCCの間に余分なナビゲーションコントローラがありますか?なぜAAAからCCCに直接接続するのはなぜですか? – Gobot

答えて

9

ナビゲーションコントローラへのポインタがある場合、そのviewControllers配列を取得できます。その配列では、objectAtIndex:0はCCCになります。

+0

AAAからナビゲーションコントローラに接続すると、CCCはまだ作成されていません。もし私が間違っていると私に教えてください – user1046037

+0

私は別のポスト(下のリンク)で素敵な解決策を見つけました: http:// stackoverflow。com/questions/8450545/pass-data-to-uinavigationcontroller-partent appDelegateには、どこからでもアクセスできるデリゲートを含めることができます。 – user1046037

+5

アプリケーションデリゲートをグローバル状態の通信のソースとして使用しないでください。 CCCは、navコントローラが作成されるのと同時に作成されます。 – jsd

0

素敵なソリューションをUIStoryboardSequeにカテゴリを作成することです

UIStoryboardSegue + TopLevel.h

@interface UIStoryboardSegue (TopLevel) 

@property (readonly) id topLevelDestinationViewController; 

@end 

UIStoryboardSegue + TopLevel.m

その後
@implementation UIStoryboardSegue (TopLevel) 

- (id)topLevelDestinationViewController 
{ 
    id dest = self.destinationViewController; 
    if ([dest isKindOfClass:[UINavigationController class]]) { 
     UINavigationController* nav = dest; 
     dest = nav.topViewController; 
    } 
    return dest; 
} 

@end 

カテゴリを使用する

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    [super prepareForSegue:segue sender:sender]; 

    if ([[segue topLevelDestinationViewController] respondsToSelector:@selector(setSomeProperty:)]) 
    { 
     [[segue topLevelDestinationViewController] performSelector:@selector(setSomeProperty:) withObject:self.someProperty]; 
    } 
} 

あなたのコードは非常に汎用的になり、segueの宛先ビューコントローラがナビゲーションコントローラであるかどうかは関係ありません

4

受け入れられた回答の実装方法が不明な人は、ここをクリックしてくださいコード例をより明確に説明する方法 "have a pointer to the navigation controller"。次のコードは、AAA(AAAViewController)からNSStringをCCC(CCCViewController)に、Segueの識別子 "ToCCC"とともに渡します。

1)fooへのポインタをCCCViewController.hに作成します。 AAAViewController.m

// CCCViewController.h 

#import <UIKit/UIKit.h> 

@interface CCCViewController : UITableViewController 

@property (strong, nonatomic) NSString *foo; 

@end 

2)は、()ナビゲーション・コントローラを介してCCCViewControllerへのポインタを作成し、fooを設定します。

// AAAViewController.m 

#import "AAAViewController.h" 
#import "CCCViewController.h" // Note the import statement for CCC. 

@implementation AAAViewController 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString: @"ToCCC"]) 
    { 
     CCCViewController *ccc = [[segue.destinationViewController viewControllers] objectAtIndex: 0]; 
     ccc.foo = @"A string passed from AAA"; 
    } 
} 

@end 

3)は、例えばCCCViewController.mfoo(コンソールにそれをログ)で何かをします。

// CCCViewController.m 

#import "CCCViewController.h" 

@implementation CCCViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Log foo to the console. 
    NSLog(@"%@", _foo); 
} 

@end