2015-02-07 427 views
1

從Apple的文檔中,如果我重寫該方法,我必須在某個時候調用super。我有兩個ViewController與一個segue連接在一起。如果您在第一個VC中按下一個按鈕,則會轉到第二個VC。問題是當我覆蓋了第一個VC的viewDidAppear,並且調用了第二個VC的super,viewDidAppear,這不是我想要的。我刪除了super,一切都很好。viewdidAppear:爲什麼我必須打電話給超級?

  • 爲什麼從第一個VC打電話給super.viewDidAppear會叫secondVC.viewDidAppear
  • 是不是打電話給viewDidAppear不好主意?

預先感謝您!

+1

是第一個VC和第二類VC相互關聯?我的意思是繼承。 – FreeNickname 2015-02-07 16:06:40

+1

顯示兩個視圖控制器的代碼。調用'[super viewDidAppear:animated]'不會調用另一個視圖控制器上的方法,除非在你的程序中有一個奇怪的錯誤。你更可能將實例與類混合在一起。 – Codo 2015-02-07 16:12:11

+0

是的,謝謝你們:D – 2015-02-07 17:17:22

回答

5

不打電話[super viewDidAppear]確實是一個壞主意。 UIViewController的基類有viewDidAppear中的代碼需要調用,否則事情將無法正常工作。我忘記了之前撥打[super viewDidAppear],事情無法正常工作。我忘記了什麼是壞的影響,但它們微妙而混亂,無法調試。

第二個視圖控制器調用[super viewDidAppear]調用第一個視圖控制器沒有任何意義。我認爲你是誤解。

我的猜測是你的第二個視圖控制器是第一個視圖控制器的子類。在你的第二個視圖控制器中,當你調用[super viewDidAppear]時,它會調用父類的方法實現。由於您的第二個視圖控制器的類與第一個視圖控制器相同,因此該父類CLASS的方法被調用。但是它不會在第一個視圖控制器實例上調用。子視圖控制器有多個可以調用的viewDidAppear版本:它的.m文件中的自定義方法,寫在其父類的.m文件中的方法,以及在其祖父類中定義的方法的任何實現,非常棒-grandparent類等

隱喻:

想象一下狗的進化。首先只有狗,沒有品種的狗。 狗可以擺動它們的尾巴,所以所有的狗都有一個「搖擺」的方法。

母狗有一隻小狗是第一個指針。 (類Pointer。)它繼承了它的父類的所有方法,包括wag,但也有一個方法「point」。

它也有一點擺動它的正常搖擺,所以它有一個自定義的搖擺方法的實施。這是標準wag方法的新結局,所以指針類首先調用父類的wag方法,然後是自定義方法。

在指針的「wag」方法的實現中,它在調用[super wag]來完成父類CLASS的之前添加它自己的擺動。

使指針類的WAG方法可能是這樣的:

@implementation Pointer 

- (void) wag; 
{ 
    [super wag]; 
    [self tailWiggle]; 
} 

@end 

現在,如果你有媽媽(Dog類的實例),毗鄰各小狗(類指針的一個實例)另外,你的兩種搖擺方法都有斷點,這裏將會發生什麼。

當小狗搖尾巴時,它首先調用父類** CLASS的* wag方法。 (它並沒有要求它的母親Dog搖擺它的尾巴,它使用父類定義的狗搖擺方法。)

既然你在Dog類和指針類,你會在Dog類的wag方法中看到一個斷點。然而,它仍然是搖擺尾巴的小狗。在最後添加指針特定的擺動之前,它只是做了第一個正常的Dog風格的搖擺。所以這是狗的小狗實例,做了Dog版本的Wag,它的代碼是在Dog類的實現中定義的。

您可能誤解了斷點/日誌聲明,並認爲您看到母狗的擺動方法正在啓動。然而,這並不是什麼事情。

現在,回到你的問題。

說視圖控制器之一是類型ParentVC的,和視圖控制器2是類型ChildVC,它從ParentVC繼承的:

@interface ChildVC: ParentVC 
... 
@end 

視圖控制器2是類型的ChildVC,視圖控制器1.當的子類視圖控制器2調用[super viewdidAppear],它在爲ParentVC類定義的代碼中調用它。這與在視圖控制器1中調用該方法不同。

查看調試變量列表並記下視圖控制器1和視圖控制器2的內存地址。當您在呼叫中斷到viewDidAppear時,請注意調用該方法的對象的內存地址。

當視圖控制器2個呼叫[super viewdidAppear],你會看到在ParentVC.m文件運行定義的代碼,但運行代碼的對象是視圖控制器2

+0

我總是喜歡看你的答案 – soulshined 2015-02-07 17:05:00

+0

謝謝。你完全在意。問題是第二個VC是父類被定義爲'ViewController'而不是'UIViewController'! – 2015-02-07 17:16:43

+1

有時可以使視圖控制器的其他自定義視圖控制器類的子類有效。 – 2015-02-07 18:16:08

相關問題