2014-02-18 34 views
1

我的項目有這樣的設計:故事板通數據從第三VC到第一個VC

VC1 --- firstSegue ----> VC2 --- secondSegue ---> VC3

我通過使用協議/委託方法將數據從VC2向VC1和VC3向VC2反向傳遞沒有問題。如果我想直接將數據從VC3傳遞給VC1,有可能嗎? 或者我應該從VC1插入一個新的segue到VC3?

===================================更新========== ============================= 我的情況是當VC3執行「-viewDidLoad」時,我想讓VC1執行一些操作。行動完成後,VC3將繼續工作。

+0

傳遞從一個VC1到VCN – Rajesh

+0

不,絕對不使用一個單獨的數據使用辛格爾頓數據存儲庫。這不是單身人士的目的。這樣做只會導致未來的痛苦。建議使用展開Segmentation,如@nkukushkin。 – Fogmeister

+0

但Unwind Segues必須退出第三個VC,對吧?如果我不想退出第三個VC,該怎麼辦? – user3322987

回答

1

選項1:使用NSUserDefaults的存儲和檢索數據

步驟1:用於存儲

NSUserDefaults in VC3 view controller 

[[NSUserDefaults standardUserDefaults] setObject:@"hello" forKey:@"mydata"]; 

步驟2:用於檢索

NSUserDefaults in VC1 or any other controller: 

NSString* receivedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"mydata"]; 



選項2:使用代表團和協議



在VC3.h

@class VC3; 

@protocol VC3Delegate <NSObject> 
- (void)addItemViewController:(VC3 *)controller didFinishEnteringItem:(NSString *)item; 
@end 

@interface 


@property (nonatomic, weak) id <VC3Delegate> delegate; 

在VC3我們所說的消息,當我們跳出委託視圖控制器。

NSString *itemToPassBack = @"Pass this value back to VC1"; 
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; 

以上就是VC3。現在在VC1.h中,告訴VC1導入VC3並符合其協議。

#import "VC3.h" 

@interface VC1 : UIViewController <VC3Delegate> 

在VC1.m從我們的協議實現以下方法

- (void)addItemViewController:(VC3 *)controller didFinishEnteringItem:(NSString *)item 
{ 
    NSLog(@"This was returned from VC3 %@",item); 
} 

我們需要做的最後一件事就是告訴VC3是VC1是其委託我們對推前VC3導航堆棧。

NSMutableArray *arrayOfControllers = [[NSMutableArray alloc] initWithObjects:self.navigationController.viewControllers, nil]; 

    for (UIViewController *vc in arrayOfControllers) { 
    if ([vc isKindOfClass:[VC3 class]]) { 
     //It exists 
      vc.delegate = self; 
    } 
+0

嗨,我不是從VC1推到VC3,而是從VC1到VC2到VC3。那麼我應該把「VC3.delegate = self」放在哪裏? – user3322987

+0

@ user3322987 - 我按照上述編輯了我的答案scenerio –

+0

我認爲我們需要把VC3.delegate放在「 - (void)prepareForSegue:」? – user3322987

相關問題