2011-12-03 3 views
0

2つのビューをポップするときにデータを後方に送る必要があります。iOS dev - UINavigationController:2番目の親ビューにデータを後方に送ります。

#import <UIKit/UIKit.h> 
#import "ThirdViewController.h" 

@class SecondViewController; 

@interface RootViewController : UIViewController <PassInt> 

@property (strong, nonatomic) SecondViewController *secondViewController; 
@property (strong, nonatomic) ThirdViewController *thirdViewController; 
@property (nonatomic) int intNumber; 

@end 

RootViewController.m

#import "RootViewController.h" 
#import "SecondViewController.h" 

@implementation RootViewController 

@synthesize secondViewController = _secondViewController; 
@synthesize thirdViewController = _thirdViewController; 
@synthesize intNumber = _intNumber; 

- (void)setIntNumber:(int)number{ 
    _intNumber = number; 
} 

#pragma mark - View lifecycle 

- (void)viewWillAppear:(BOOL)animated { 
    if(!_thirdViewController){ 
     _thirdViewController = [[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:[NSBundle mainBundle]]; 
    } 
    if(!_secondViewController){ 
     _secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]]; 
     self.secondViewController.thirdViewController = self.thirdViewController; 
    } 
    [self.navigationController pushViewController:self.secondViewController animated:YES]; 
    } 

@end 

SecondViewController.hに

#import <UIKit/UIKit.h> 

@class ThirdViewController; 

@interface SecondViewController : UIViewController 

@property (strong, nonatomic) ThirdViewController *thirdViewController; 

@end 

RootViewController.h:私は、プロトコルを使用してみましたので、これは私のコードの一部です。

SecondViewController.m

#import "SecondViewController.h" 
#import "ThirdViewController.h" 

@implementation SecondViewController 

@synthesize thirdViewController = _thirdViewController; 

... 

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{ 
     [self.navigationController pushViewController:self.userPreferencesViewController animated:YES]; 
} 
@end 

ThirdViewController.h

#import <UIKit/UIKit.h> 

@protocol PassInt <NSObject> 
@required 
- (void) setIntNumber:(int)number; 
@end 

@interface ThirdViewController : UIViewController{ 
id <PassInt> delegate; 
} 
@property (retain) id delegate; 
- (IBAction)saveChanges; 

@end 

ThirdViewController.m

#import "ThirdViewController.h" 

@implementation ThirdViewController 

- (IBAction)saveChanges{ 
    int someInt = 3; 
    [[self delegate] setIntNumber:someInt]; 
    UINavigationController *tempNavigationController = self.navigationController; 
    [tempNavigationController popViewControllerAnimated:NO]; 
    [tempNavigationController popViewControllerAnimated:NO]; 
} 
... 
@end 

私は任意の助けをいただければ幸いです! UINavigationController referenceチェックで

+0

あなたは達成しようとしていることをさらに説明できますか?私が考えることができる方法は少なくとも4つありますが、1つを選択することはあなたの目標に依存します。ありがとう。 –

+0

ThirdViewControllerのsomeIntに応じて、私はrootViewControllerから別のsecondViewControllerを呼び出します。したがって、そのintをthirdViewControllerからrootViewControllerに渡す必要があります。この解決策は機能していない、私は理由を知らない。私は最初の親に後方に送るときだけ例を見つけました。 – iblagajic

+0

ThirdViewControllerでは、setSymbolSizeの代わりにsetIntNumberです – iblagajic

答えて

0

プロパティコール:

@property(nonatomic, copy) NSArray *viewControllers 

議論
ルート・ビュー・コントローラは、アレイ内のインデックス0にあり、バックビューコントローラは、インデックスN-2であり、そして先頭のコントローラはインデックスn-1にあり、nは配列内の項目の数です。

これは、あなたにrootViewControllerのハンドルを与えることができます。
それはあなたのための良い解決策でしょうか?
他の方法があります。しかし、あなたのコメントから、私はそれが一致する可能性があると思う。


[[self.navigationController viewControllers] objectAtIndex:0].someProerty;

+0

その配列から、私のrootViewControllerのインスタンスへのポインタを取得して、ただrootViewController.intNumber = someIntを使用できますか?私はそれを行うことができれば、これは素晴らしい解決策です! – iblagajic

+0

@ClarkKentそれはうまくいくはずです。私はそのように使用したことはありません。私はそれをそうする必要がないように設計しようとしているからです。しかし、受け入れやすい方法で見えるrootViewControllerに到達する。しかし、5 ViewControllerを持つ階層から3番目のViewControllerに到達するには、より汎用的で再利用可能な方法を行うことを強くお勧めします。しかし、根本的には再利用可能です。 –

0

もう一つの方法は、NSNotificationsを使用することができます。 RootViewControllerをThirdViewControllerによって通知された通知のオブザーバとして再登録させます。次に、ThirdViewControllerによって通知された通知のuserInfoディクショナリで、someNntをNSNumberとして渡します。

これは、ThirdViewControllerが情報を必要とするオブジェクトの種類を知る必要がないため、十分な抽象化を提供します。あなたはあなたが投稿コードであなたのThirdViewControllerのデリゲートメンバーに何かを割り当てることはありませんしている

グッドラック

0

。また、代議員は、通常は割り当てておくべきであり、保持するべきではありません。