你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS頁面間傳遞消息之Delegate

iOS頁面間傳遞消息之Delegate

編輯:IOS開發綜合

在開發應用的過程中,我們需要頻繁地在界面之間傳遞消息,有時候是傳遞信息,有時候是傳遞一個信號即可。在iOS開發中,有多種傳遞信息的方式。比如最簡單的,如果我們要在從一個界面進入另一個界面時給新界面傳遞一些消息,只需要給新界面定義一些屬性,然後在創建新界面的時候設置其屬性值即可。

那麼如果要從新界面反過來傳遞信息給原先的界面怎麼做呢,怎麼建立起一個溝通的橋梁呢?iOS也提供了很多種方式,比如Notification、Block、UserDefault等等。本文就講解最常見也是最常用的一種方式,幾乎每個學習了一段iOS開發的人都見過也用過,只是可能不明白,那就是Delegate——委托。

回想一下,在使用列表,也就是UITableView的時候,除了創建這個列表對象,還會用到UITableView Datasource和UITableView Delegate。當我們要設置點擊列表行的相應時,就要用到UITableView Delegate的方法,這裡要講的,跟這個是同一個東西。

先看一個效果:
\

在主界面有一個按鈕和一個方塊,方塊原本是隱藏的。進入子界面,子界面有兩個按鈕,一個用來告訴主界面顯示方塊,一個用來告訴主界面隱藏方塊。那子界面時怎麼告訴主界面的呢?<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPrPpz/O12Mu1o6xkZWxlZ2F0Zb7NysfSu7j20K3S6aGj1eK49tCt0unTydfTvefD5raoz8K55r7Yo6yxyMjnteO798/Uyr63vb/ptcSwtMWlu+HI57rOo6y147v30v6y2LXEsLTFpdPWu+HI57rOoaPIzrrOvefD5ra8v8nS1Mn5w/fO0tKq1/HRrdfTvefD5rXE1eK49tCt0umho8i7uvO1sdTa19O958PmtKW3otCt0unE2sjdo6zSsr7NysfV4sDvtcS147v3wb249rC0xaXKsaOs1/HRrdCt0um1xL3nw+ajrNXiwO++zcrH1ve958Pmo6y+zbvhytW1vdK7uPbQxbrFo6zIu7rzvfjQ0M/g06a1xLLZ1/e8tL/JoaPV4rj20MW6xb/J0tSw/Lqs0rvQqdDFz6KjrLHIyOe499bWttTP86O619a3+7SuoaLNvMasoaLK/b7dwfe1yLXIo6zSsr/J0tSyu7D8uqzQxc+io6y99r32ysfSu7j20MW6xaGj1eK49sD919PW0L7Nvfa99srHsruw/Lqs0MXPorXE0MW6xaOsscjI59Kqz9TKvre9v+m1xNDFusW6zdKq0v6y2Le9v+m1xNDFusWhozwvcD4NCjxwPsC0v7S/tLT6wuujujwvcD4NCjxwPs/Iv7TX073nw+ajrM7Sw8fLtdfTvefD5tKqtqjPwrnmvtijrMrXz8jSqtTaLmjOxLz+1tDJ+cP3uea+2KO6PC9wPg0KPHByZSBjbGFzcz0="brush:java;"> @protocol SecondViewControllerDelegate - (void)showTheSquare;// 顯示方塊的委托 - (void)dismissTheSquare;// 隱藏方塊的委托 @end @interface SecondViewController : UIViewController @property (nonatomic, weak) id delegate;// 聲明delegate對象 @end

可以看到,子界面首先定義了兩個協議,一個表示顯示方塊,一個表示隱藏方塊,其本質是兩個方法。然後聲明了一個屬性,同聲明其他對象一樣,只不過這裡是一個delegate對象,其類型為我們上面聲明的協議類型。

定下規矩名後,我們要在點擊按鈕的時候去使用規矩,所以在.m文件中:

// 顯示方塊
- (void)showSquare {
    [self.delegate showTheSquare];// 調用委托方法
    [self.navigationController popViewControllerAnimated:YES];// 返回上個界面
}

// 隱藏方塊
- (void)dismissSquare {
    [self.delegate dismissTheSquare];// 調用委托方法
    [self.navigationController popViewControllerAnimated:YES];// 返回上個界面
}

在兩個按鈕的響應方法中,分別用delegate對象調用了定下的兩個委托方法。這樣子界面的工作就做完了。

回到主界面,我們之前說,主界面要表示我遵循子界面定下的規矩,怎麼聲明呢?和使用UITableView對象時的做法一樣,在.m文件的開頭表示一下就好:

// 遵循子界面的協議
@interface ViewController ()

這裡的協議名就是我們在子界面中聲明協議時定下的名字,還記得吧,這個協議中我們定下了兩個方法,分別表示顯示和隱藏方塊。另外要特別注意不能忘記的是,在創建子界面的時候,要將子界面的屬性——delegate對象,設為self:

// 進入子界面
- (void)showSecondView {
    SecondViewController *secondVC = [[SecondViewController alloc] init];
    secondVC.delegate = self;
    [self.navigationController pushViewController:secondVC animated:YES];
}

這其實就跟我們用UITableView時要把tableView的delegate和datasource都設為self是一個道理,這樣才能收到消息。

好了。我們之前已經在子界面中設置了,點擊兩個按鈕會調用那兩個方法,但是這兩個方法具體要做什麼,確實在主界面中設置的。因為任何界面都可以遵循使用這些協議方法,而每個界面的需求是不一樣的,子界面只負責喊話說我要調用這個方法了,具體方法干什麼還是在主界面中實現,這裡我們就是顯示和隱藏方塊:

#pragma mark - SecondViewController Delegate

// 顯示方塊
- (void)showTheSquare {
    self.square.alpha = 1;
}

// 隱藏方塊
- (void)dismissTheSquare {
    self.square.alpha = 0;
}

這樣就可以實現上面動圖的效果了,也就是說,子界面成功地把信號傳遞回了主界面,稱為回調。如果你在自己的開發中發現沒有效果,最可能的就是忘記將delegate屬性設為self了,這樣是收不到信號的。

我們最開始也說了,有時候只需要傳遞信號,而有時候需要傳遞一些具體的信息對象,那要怎麼做呢?其實也很簡單,我們的協議不是規定了很多方法嗎,在這些方法裡加上參數就可以把數據對象當參數傳遞了~


查看示例工程:https://github.com/Cloudox/DelegateDemo

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved