iOS如何利用Delegate來實現兩個UIView之間的傳值

兩個View之間的傳值能夠有多種方式。但本人以爲最合理最天然而且最安全的方式是經過Delegate方式。 安全

設想一個場景: spa

1. 有兩個View,分別是A和B。 指針

2. 點擊A中的某個按鈕,出來B。 code

3. 對B作某些操做(好比輸入文字到textField,選擇picker等等)。 io

4. 而後點擊B中的肯定按鈕,將在B中進行的操做所產生的數據傳遞給A。 class

這種應用場景在編寫iPhone App應用的時候是十分常見的,好比利用modelview來進行某些條件的選擇,進行註冊操做等等。下面具體說說利用Delegate是如何將View B中的數據傳遞迴View A。 變量

第一步: model

在B類的類定義以前加入一下代碼,定義一個delegate: 方法

@protocol ViewBControllerDelegate <NSObject>   
- (void) viewAWillDoThisAction:(UIViewController *) currentView;     
@end

這個delegate定義了一個方法,全部實現了這個delegate的類都必須實現這個方法。 ember

而後再在B類的類定義中添加一個member,加入如下代碼:

NSObject<FilterSpotsViewControllerDelegate> *view_A;

從名字來看,就知道待會這個值會被賦予View A。

第二步:

讓A類實現ViewBControllerDelegate:

@interface ViewAController : UIViewController <ViewBControllerDelegate>

而且讓A類實現方法viewAWillDoThisAction:

- (void) viewAWillDoThisAction:(UIViewController *) view_B {  
   //利用view_B來傳值。如self.a = view_B.a;  
}


上面代碼中,將會在B類中將B類本身(self)的指針傳遞給view_B(見下面第四步)。這樣就能夠把B類的數據傳遞給A類了。

第三步:

就如我以前所說的,View A點某個按鈕以後,出現View B。假設這個按鈕對應的方法是「-(void) pushViewB: (id) sender"。那麼應在這個方法中將A類自身的指針(self)傳遞給以前第一步在B類中定義的成員變量View_A:

-(void) pushViewB: (id) sender {     
    //初始化一個B類,view_B      
    view_B.view_A = self;   //賦值  
    //推出View B  
}


第四步:

在B類,假設在View B中作完全部操做以後,點擊肯定按鈕,返回View A,並將數據傳回給view A。假設這個肯定按鈕的方法是-(void)done: (id) sender。那麼須要在這個方法中調用A類實現的viewAWillDoThisAction:

-(void) done: (id) sender {  
[self.view_A viewAWillDoThisAction:self];  
//返回View A  
}

上面代碼注意兩個問題:第一是調用view A的實現了delegate的方法,第二是將自身的指針傳遞給view A的方法,以方便view A能取到view B的數據。

以上就是整個利用delegate機制來進行兩個view之間的傳值的過程。這裏注意一點:這兩個view之間是有關係的(view A推出view B,從view B推出view A)。對於兩個徹底沒有關係的view,如何傳值呢?理論上利用delegate也是能夠的,但並非最好的方法。最好的方法是利用NSNotification,留到往後再說。

多嘴一點,其實說是利用delegate的方式來傳值,其本質是傳遞類的指針來進行類成員的傳值(實現了delegate的類A將自身傳給了類B,而後類B又將自身傳回去給類A),之因此用到delegate的機制,只不過是爲了說明這個順序:當B進行了某個操做的時候,須要A去作另一件事。這就是delegate的本質。也就是我文章開頭所說「最合理最天然」的緣由。

相關文章
相關標籤/搜索