2013-08-24 37 views
0

我一直期待在視圖控制器幾天現在(搜索Xcode的幫助下,谷歌和堆棧溢出),我想我對此有所瞭解,但不是很多。 我有一些代碼,我無法理解。 所以在這裏,我在我正在閱讀的書中找到以下代碼,並且我不確定如果我理解正確。諒解/澄清視圖控制器語法

-(void)prepareForSegue(UIStoryboardsegue *)segue sender:(id)sender{ 
    ((ViewController2 *)segue.destinationViewController).delegate = self; 
} 

首先,我不知道爲什麼我們在這裏對我們的第二個視圖控制器(viewController2)進行了類型轉換。 我覺得我得到了休息,雖然,我們採取的方法的SEGUE參數(持有約在SEGUE涉及的視圖控制器信息),我們訪問destinationViewController(意思是我們要訪問的是我們要視圖控制器) 。然後,我們將目標視圖控制器的委託屬性設置爲self。我相信我們將委託屬性設置爲self,因爲我們想要將消息發送給我們將要使用的視圖控制器中的委託。

繼承人的最後一個我不明白:

在頭文件:

@property (weak, nonatomic)id delegate; 

在實現文件:(該controllerVisisble屬性是一個布爾值,並更改爲YES時,用戶點擊一個按鈕來執行手動SEGUE到第二視圖控制器,這是此一)

-(void)viewWillDisappear:(BOOL)animated{ 
    [super viewWillDisappear:animated]; 
    ((ViewController *)self.delegate).controllerrVisisble=NO; 
} 

下面有什麼,我認爲這樣做:在viewWillDisappear方法被稱爲磨片n視圖正在關閉/刪除。

我對[super viewWillDisappear:animated]不太確定,但是我猜測它在視圖消失時會給出動畫嗎?但是,我刪除了該行,並且我的dismissViewControllerAnimated方法仍然在視圖控制器被解僱。

這裏是真正讓我困惑的部分。我們需要以某種方式訪問​​第一個視圖控制器的dateChooserVisible屬性,將其設置爲NO,因此我們可以通過我們的按鈕再次訪問第二個視圖控制器。但是,我不明白爲什麼我們必須使用類型轉換(viewController *),然後輸入self.delegate。我也不明白爲什麼我們在頭文件中創建了一個名爲delegate的屬性,在這裏使用。

回答

0

很多這些問題不僅僅是視圖控制器的上下文中更通用。

  • [super methodName]調用名爲methodName的方法的超類實現。就你而言,Apple已經在UIViewController的viewWillDisappear:方法中編寫了一些代碼(我們無法訪問)。重寫超類中的方法時總是調用super。

  • 注意viewWillDisappear:每當視圖設置爲消失只是回調觸發。我的猜測是,超此方法的實現轉發此回調到子視圖控制器,特別是在標準的容器類的像UINavigationControllerUITabBarController的情況。

  • 類型轉換確實似乎沒有必要,可以隨時撥打沒有編譯器錯誤/警告的方法,如果接收器是兩種類型id或提供了一個聲明,在其@interface調用的方法。

  • 就代表去說,協議和委託是Objective-C的主要部分,並廣泛用於Apple的API中。 This link可能會幫助你瞭解他們的工作方式;它對我非常有幫助。

+0

因爲編譯器只知道目標控制器是一個通用視圖控制器,所以你必須告訴它是一個特定的自定義類。然後,您可以分配在segue期間在控制器之間傳遞數據引用所需的屬性。 – timquinn

+0

好點,我錯過了那一個,我只看到了'(ViewController *)self'位。 – aopsfan