關(guān)于presentModalViewController的一點兒思考
關(guān)于presentModalViewController的一點兒思考
有一個多月沒有寫blog了,手有點兒生。今天沒事兒,突然想起以前文檔中看到關(guān)于彈出模態(tài)對話框的一個知識點,于是想著何不動手驗證一下。
我們都知道使用彈出模態(tài)視圖時有兩個重要的函數(shù)presentModalViewController和dismissModalViewControllerAnimated,前面一個函數(shù)相信大家使用起來都沒有問題,我想說的是后面這個函數(shù)dismissModalViewControllerAnimated,通過字面我們可以看出它的意思就是使彈出視圖消失。我們設(shè)A彈出B,那么A就是presenting一方,B就是presented一方。那么該由誰來調(diào)用這個方法呢,是彈出的一方,還是被彈出的那一方呢,為此找到官方文檔中如下解釋:
The presenting view controller is responsible for dismissing the view controller it presented. If you call this method on the presented view controller itself, however, it automatically forwards the message to the presenting view controller.
通過解釋我們可以看出,presenting一方是負責讓彈出模態(tài)視圖消失的,但是系統(tǒng)在此處幫我們做了一個遍歷就是當我們在被彈出一方調(diào)用該函數(shù)時候,系統(tǒng)會自動把這個消息傳遞到彈出它的那個VC中。
下面我們在思考個問題,如果A彈出B,B又彈出C,此時我們通過B調(diào)用dismissModalViewControllerAnimated方法,到底是只有C被dismiss還是B和C一起被dismiss呢?
我寫了一個小程序驗證了一下,程序如下:
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 2 { 3 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 4 // Override point for customization after application launch. 5 _svVCA = [[SvViewController alloc] initWithNibName:nil bundle:nil]; 6 self.viewController = [[[UINavigationController alloc] initWithRootViewController:_svVCA] autorelease]; 7 [_svVCA release]; 8 _svVCA.view.backgroundColor = [UIColor clearColor]; 9 _svVCA.contentStr = @"A"; 10 11 self.window.rootViewController = self.viewController; 12 [self.window makeKeyAndVisible]; 13 14 _svVCB = [[SvViewController alloc] init]; 15 _svVCB.contentStr = @"B"; 16 [_svVCA presentModalViewController:_svVCB animated:NO]; 17 [_svVCB release]; 18 19 _svVCC = [[SvViewController alloc] init]; 20 _svVCC.contentStr = @"C"; 21 [_svVCB presentModalViewController:_svVCC animated:NO]; 22 [_svVCC release]; 23 24 [_svVCB dismissModalViewControllerAnimated:NO]; 25 //[_svVCB dismissModalViewControllerAnimated:NO]; 26 27 return YES; 28 }
上面程序中我們可以看出,一開始我們創(chuàng)建一個A,然后添加到window中,然后彈出B,B在彈出C,接著我們就調(diào)用[_svVCB dismissModalViewControllerAnimated:NO];
運行結(jié)果如下:

上圖中最左邊的圖是沒有調(diào)用任何dismiss的情況下的結(jié)果,中間這幅圖是通過B調(diào)用一次dismissModalViewControllerAnimated的結(jié)果,右邊的圖是連著通過B調(diào)用兩次dismissModalViewControllerAnimated的結(jié)果。
通過程序測試我們可以發(fā)現(xiàn)當一個VC即是被彈出方(被A彈出),也是彈出方(彈出C)的時候,調(diào)用dismiss的時候是直接將其彈出的VC消失掉,而不是傳遞該消息到彈出它的VC去,只有當該VC沒有彈出別的VC的時候才會傳遞消息到彈出它的VC去。這塊兒可能說的有點兒繞,簡單的說就是無私原則,就是B已經(jīng)占了資源了,當接到釋放命令的時候,就必須的先交出自己的,自己沒有占有資源的時候才能嘗試向上一級發(fā)出申請。
??請樓主喝杯豆?jié){??
![]() |

浙公網(wǎng)安備 33010602011771號