2014-03-04 66 views
3

我有兩個ViewController,它們不直接與Segue連接。但是我想在第二個VC中更改一個字符串,這是我在第一個VC中獲得的。我的嘗試是:從Storyboard獲取ViewController

#import "secondViewController.h" 

    @interface firstViewController() 
    @property NSString* originalString; 
    @end 

    @implementation firstViewController 

    -(void)viewDidDisappear:(BOOL)animated{ 
     [super viewDidDisappear:animated]; 
     secondViewController* svc = [secondViewController new]; 
     svc.anotherString = self.originalString;  
    } 

但它劑量的工作,因爲我只創建了第二個VC的實例,所以沒有保存的值。我也不能使用Storyboard ID,因爲我使用Xcode 5.我有一個menuVC,你可以從中獲得第一個VC和第二個VC。從第一個VC開始,我可以返回(使用navigationbackbarbutton)到菜單。所以:menu-> firstVC->菜單。菜單 - > secondVC - > ...->菜單

我嘗試用StoryboardID:

-(void)viewDidDisappear:(BOOL)animated{ 
     [super viewDidDisappear:animated]; 

     secondViewController* svc =[[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"secondVCSrorybradID"]; 

     svc.anotherString = self.originalString;  
    } 
+0

您如何從第一個VC獲得第二個VC? – rdurand

+0

?爲什麼你不能使用storyboard id? – Ilario

+0

你問你爲什麼originalString沒有更新,當你改變svc.anotherString? – iain

回答

2

你應該通過連續的UIViewController的導航傳遞數據。如果,例如,你有一個像FirstVC > SecondVC > ThirdVC導航:

在你FirstVC.m,用途:

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

    ((SecondVCClass*) segue.destinationViewController).secondVCString = _firstVCString; 
} 

隨着secondVCString在你的第二個視圖控制器是一個@property

在你SecondVC.m,用途:

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

    ((ThirdVCClass*) segue.destinationViewController).thirdVCString = _secondVCString; 
} 

隨着當然thirdVCString在你的第三個視圖控制器是一個@property


編輯:

當你更新你的問題,這裏是我的建議:

  • 在你MenuVC,補充一點:

    @property (nonatomic, weak) NSString *importantString; 
    
  • 在你的FirstVC和SecondVC,加上:

    @property (nonatomic, weak) MenuVCClass *menu; 
    
  • 當你推到FirstVC或SecondVC,使用prepareForSeguemenu屬性設置目標的視圖控制器到您的菜單:

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    
        if ([segue.identifier isEqualToString:@"FirstSegue"]) 
         ((FirstVC*) segue.destinationViewController).menu = self; 
        else if ([segue.identifier isEqualToString:@"SecondSegue"]) 
         ((SecondVC*) segue.destinationViewController).menu = self; 
    } 
    
  • 在FirstVC或SecondVC,你可以改變從NSString值您的菜單使用_menu.importantString = @"";

+0

謝謝,但是我的第一個和我的VC都來自另一個VC,所以當我回到我的菜單時,「prepareForSegue」方法將不會被調用。 – Sam

+0

你可以用你的應用程序的結構編輯你的問題嗎?就像FirstVC - SecondVC - 等 – rdurand

+0

@ user3343292:我更新了我的答案 – rdurand

1

您不應該使用new創建視圖c ontroller。

如果您正在使用故事板但未使用segues,則仍然可以從故事板創建視圖控制器並調用它。

使用方法instantiateViewControllerWithIdentifier:來創建目標視圖控制器的實例。設置你想要設置的屬性,最後打個電話來顯示它(以模態形式呈現,將其推到導航堆棧上,或者任何適合你的程序的地方)。

+0

謝謝,但就像我已經說過,我不能使用Starboard ID – Sam

+0

不能使用你的故事板ID嗎?爲什麼?你說「因爲我使用Xcode 5」,這沒有任何意義。 –

+0

但我沒有任何storryboard ID,真的......我只有標題 – Sam

11

你可以將字符串傳遞給第二個視圖控制器與此代碼。

secondViewController* svc =[self.storyboard instantiateViewControllerWithIdentifier:@"Your Second VC's Storyboad ID"]; 
svc.anotherString = self.originalString;  
[self presentViewController:svc animated:YES completion:nil]; 

//您必須在第二個View Controller的.h文件中創建anotherString屬性。

現在你可以得到originalString的字符串到第二個VC。現在你可以將這個值返回第二個VC到第一個VC。

希望這可以幫助你。

相關問題