2012-08-09 81 views
4

我可以毫無問題地將數據從一個視圖傳遞到其他視圖。但這是我面臨的問題。如何將數據從一個視圖傳遞迴IOS中的其他視圖?

比方說 - >將數據傳遞到其他視圖

ViewA->ViewB This working perfectly fine 
ViewB->ViewC This working perfectly fine 
ViewC->ViewB Here is the problem. 

我嘗試使用推SEGUE,它進入ViewB但是當我按下後退按鈕它去ViewC->後退按鈕 - > ViewB->後退按鈕 - >查看A.當我按下後退按鈕時,從ViewB它必須去ViewA。

嘗試使用modal segue,它去ViewB,但我不能去任何地方。

由於我是新來的iOs我真的不知道如何實現這一目標?

如何將數據從ViewC傳回ViewB?

我想你們可以幫助我。

編輯

在查看一個我打電話ViewB這樣

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if([segue.identifier isEqualToString:@"RemixScreen"]) 
{ 

    if([self.recipeFrom isEqualToString:@"ViewB"]) 
    { 

     ViewB *reciepe = [segue destinationViewController]; 
     //somedata i will pass here 

    } 
} 
} 

在視圖B我打電話這樣

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    { 
if([segue.identifier isEqualToString:@"ViewA"]) 
{ 
    ViewA *data = [segue destinationViewController]; 
    //some data 
} 
} 

感謝您的幫助球員。

回答

16

做到這一點,正確的方法是使用委託。您在prepareForSegue中使用屬性來傳遞數據,並委託傳回數據。

它的工作方式是在ViewC中有一個由ViewB在prepareForSegue中設置的委託屬性。通過這種方式,ViewC可以通過您設置的協議與ViewB進行通信。

編輯:添加代碼來演示:

ViewControllerBInterface:

@protocol ViewBProtocol 

- (void)setData:(NSData *)data; 

@end 

@interface ViewBController: UIViewController <ViewBProtocol> 
... 
@end 

這裏我們做ViewBController按照我們的協議,該協議將ViewCController溝通。

接下來是ViewCController接口:

@interface ViewCController: UIViewController 

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

... 

@end 

現在我們來看看ViewBController的prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    UIViewController* controller = [segue destinationViewController]; 
    if ([controller isKindOfClass:[ViewCController class]]) 
    { 
     ViewCController* viewCController = (ViewCController *)controller; 
     viewCController.delegate = self; 
    } 
} 

正如你可以看到,我們通過委託財產ViewC控制器鏈接到ViewB之一。現在我們做一些ViewC:

- (void)sendData:(NSData *)data 
{ 
    [self.delegate setData:data]; 
} 

你也可以使用在ViewCController您viewWillDisappear方法,如果你想。

+0

我現在嘗試委託,但其ViewC不叫ViewB我不知道發生了什麼..你有什麼好的教程來溝通與協議 – GoCrazy 2012-08-09 15:36:05

+0

我會寫一個答案,並添加一些代碼 – Cthutu 2012-08-09 15:45:00

+0

這真的很有幫助非常感謝..謝謝 – GoCrazy 2012-08-09 15:47:01

-1

您使用導航控制器嗎?如果是的話,你可以很容易地通過Singleton傳遞數據,這是我最喜歡的方式,也很容易使用。否則,如果您嘗試通過按鈕或某物瀏覽視圖,請嘗試爲您的segue設置標識符,然後調用方法「performSegueWithIdentifier」

+0

在我的項目中,我想在發送完畢後發回數據..我嘗試performsegueWithidentifier,但最終出現問題 – GoCrazy 2012-08-09 14:44:28

+0

問題如果您使用單例傳遞數據,只需將視圖控制器耦合到一個單身人士。 – Abizern 2012-08-09 19:12:41

2

我在最近的項目中解決此問題的方式是以下;

視圖AparentViewController,所以可以從視圖B視圖C在這樣的任何時候訪問;

ViewAClass *parentView = (ViewAClass *)self.parentViewController; 

然後,您可以讀取和寫入的財產,等等;

NSString *string = parentView.someStringProperty; 

parentView.someStringProperty = @"Hello World"; 

編輯 - 「回到從視圖B到ViewA用了返回鍵」

[parentView popViewControllerAnimated:YES]; 
+0

感謝您的回答budddy ..您將如何從視圖B返回到ViewA,並返回按鈕 – GoCrazy 2012-08-09 14:45:02

+0

Witin ViewB調用:'[self.navigationController popViewControllerAnimated:YES];' – 2012-08-09 14:47:55

+0

@HermannKlecker無論哪種方式工作。 – 2012-08-09 14:51:15

相關問題