1. 程式人生 > >iOS如何利用Delegate來實現兩個UIView之間的傳值

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

兩個View之間的傳值可以有多種方式。但本人覺得最合理最自然並且最安全的方式是通過Delegate方式。

設想一個場景:

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

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

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

4. 然後點選B中的確定按鈕,將在B中進行的操作所產生的資料傳遞給A。

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

第一步:

在B類的類定義之前加入一下程式碼,定義一個delegate:

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

這個delegate定義了一個方法,所有實現了這個delegate的類都必須實現這個方法。

然後再在B類的類定義中新增一個member,加入以下程式碼:

  1. NSObject<FilterSpotsViewControllerDelegate> *view_A;  
從名字來看,就知道待會這個值會被賦予View A。

第二步:

讓A類實現ViewBControllerDelegate:

  1. @interface ViewAController : UIViewController <ViewBControllerDelegate>  

並且讓A類實現方法viewAWillDoThisAction:

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

上面程式碼中,將會在B類中將B類自己(self)的指標傳遞給view_B(見下面第四步)。這樣就可以把B類的資料傳遞給A類了。

第三步:

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

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

第四步:

在B類,假設在View B中做完所有操作之後,點選確定按鈕,返回View A,並將資料傳回給view A。假設這個確定按鈕的方法是-(void)done: (id) sender。那麼需要在這個方法中呼叫A類實現的viewAWillDoThisAction:

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

上面程式碼注意兩個問題:第一是呼叫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的本質。也就是我文章開頭所說“最合理最自然”的原因。