不打電話[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
是第一個VC和第二類VC相互關聯?我的意思是繼承。 – FreeNickname 2015-02-07 16:06:40
顯示兩個視圖控制器的代碼。調用'[super viewDidAppear:animated]'不會調用另一個視圖控制器上的方法,除非在你的程序中有一個奇怪的錯誤。你更可能將實例與類混合在一起。 – Codo 2015-02-07 16:12:11
是的,謝謝你們:D – 2015-02-07 17:17:22