努力學(xué)習(xí)著......
iphone下,,如何獲取對(duì)象的句柄和其父對(duì)象的句柄,?【問(wèn)題】iphone下,如何獲取對(duì)象的句柄和其父對(duì)象的句柄,? 常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下: 對(duì)象個(gè)數(shù) 對(duì)象類(lèi)型 1 UIApplication 1 UIApplicationDelegate/subclass 1,N UIViewController/subclass 1,N UIView/subclsss 盡管有些書(shū)上說(shuō)可以繞過(guò)UIViewController直接對(duì)UIView進(jìn)行操作,,但個(gè)人認(rèn)為此層的作用用于管理視圖和視圖關(guān)系 下面分別對(duì)上述層次關(guān)系的對(duì)象類(lèi)型進(jìn)行學(xué)習(xí)。說(shuō)明下,,下面學(xué)習(xí)的東西僅和問(wèn)題有關(guān),,不會(huì)全面學(xué)習(xí)類(lèi)中的各種方法和屬性。 UIApplication 繼承于UIResponder:NSObject 框架:UIKit.framework 頭文件:UIApplication.h 每一個(gè)應(yīng)用程序都有一個(gè)UIApplication或其子類(lèi)型的實(shí)例,。當(dāng)程序被加載,,函數(shù)方法UIApplicationMain就被調(diào)用執(zhí)行,它創(chuàng)建了單件模式的UIApplication對(duì)象,。之后你可以通過(guò)執(zhí)行sharedApplication類(lèi)方法來(lái)訪問(wèn),。 看看main函數(shù)
可以看出,main函數(shù)的作用在于調(diào)用UIApplicationMain方法來(lái)創(chuàng)建一個(gè)UIApplication對(duì)象實(shí)例,,同時(shí)也管理了此類(lèi)的實(shí)例的內(nèi)存釋放,。 那么獲取UIApplication對(duì)象實(shí)例,代碼如下: 假設(shè)UIApplicationDelegate協(xié)議繼承類(lèi)XXXXAppDelegate UIApplication *app = [UIApplication sharedApplication]; XXXXAppDelegate *d = (XXXXAppDelegate *)app.delegate; //Test these code ,it is ok; 在main函數(shù)中創(chuàng)建了UIApplication實(shí)例,,同時(shí)也就綁定了XXXXAppDelegate 看看原型 int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName ); This function is called in the main entry point to create the application object and the application delegate and set up the event cycle. argc: The count of arguments in argv; this usually is the corresponding parameter to main. argv: A variable list of arguments; this usually is the corresponding parameter to main. principalClassName: The name of the UIApplicationclass or subclass. delegateClassName: The name of the class from which the application delegate is instantiated. UIApplication部分: UIApplicationMain-> UIApplication UIApplicationDelegate實(shí)現(xiàn)類(lèi) UIApplication-> sharedApplication類(lèi)方法獲取當(dāng)前程序的UIApplication實(shí)例 delegate屬性獲取UIApplicationDelegate實(shí)現(xiàn)類(lèi)的實(shí)例 windows屬性獲取當(dāng)前程序涉及到窗口類(lèi)數(shù)組 keyWindow屬性獲取當(dāng)前程序關(guān)鍵窗口 即然有了UIApplicationDelegate協(xié)議的實(shí)現(xiàn)類(lèi),,那如何實(shí)現(xiàn)UIViewController/subclass的初始化? 實(shí)現(xiàn)Controller類(lèi)的初始化的地方有兩處: application:didFinishLaunchingWithOptions: applicationDidFinishLaunching: 這兩個(gè)方法,,后者是前期版本下的。在iOS3.0以及之后,,應(yīng)該使用前者來(lái)完成開(kāi)始這個(gè)過(guò)程,。XCode4運(yùn)行的是application:didFinishLaunchingWithOptions: 當(dāng)然,你也可以刪除application:didFinishLaunchingWithOptions:,,自己添加applicationDidFinishLaunching方法來(lái)實(shí)現(xiàn),。不推薦此操作。 看下實(shí)際對(duì)UIApplicationDelegate如何編寫(xiě)其實(shí)現(xiàn)類(lèi)
看頭文件,你發(fā)現(xiàn)實(shí)現(xiàn)類(lèi),,有了兩個(gè)屬性,,window和viewController;就是保存當(dāng)前實(shí)現(xiàn)類(lèi)所關(guān)聯(lián)的window和視圖控制器 通過(guò)運(yùn)行,,輸出“AppDelegate 'window is UIApplication current keyWindow!”,,說(shuō)明實(shí)現(xiàn)類(lèi)的window屬性來(lái)源UIApplication實(shí)例當(dāng)前的keyWindow屬性,。 也就是說(shuō),如果UIApplication實(shí)例只有一份UIWindow實(shí)例,,那肯定和其UIApplicationDelegate實(shí)現(xiàn)類(lèi)的window屬性指向同一UIWindow實(shí)例,。 之所以在UIApplicationDelegate實(shí)現(xiàn)類(lèi)定義這么兩個(gè)屬性,就是為了更方便的使用UIWindow和UIViewController,,作用就是建立對(duì)象樹(shù)狀關(guān)系,,便于彼此調(diào)用和實(shí)現(xiàn)。 在這里,,應(yīng)該清楚了UIApplication和UIViewController之間是通過(guò)UIWinodw來(lái)關(guān)聯(lián)的,,盡管在UIApplicationDelegate實(shí)現(xiàn)類(lèi)中定義一個(gè)viewController屬性。修改下上面的關(guān)系圖: 常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下: 對(duì)象個(gè)數(shù) 對(duì)象類(lèi)型 1 UIApplication 1 UIApplicationDelegate/subclass 1 UIWindow 1 .rootViewController屬性 1,N UIViewController/subclass 1,N UIView/subclsss 根據(jù)現(xiàn)在的對(duì)象結(jié)構(gòu)圖,,可以知道UIWindow實(shí)例在此僅僅是起承上啟下的作用,。 UIWindow繼承UIView:UIResponder:NSObject 現(xiàn)在可以看下UIViewController 繼承UIResponder:NSObject UIViewController其子類(lèi)UINavigationController和UITabBarController為復(fù)雜視圖控制器和視圖的層次結(jié)構(gòu)提供額外的行為處理功能。 針對(duì)問(wèn)題看下,,有哪些視圖控制器可訪問(wèn),? parentViewController property searchDisplayController property splitViewController property modalViewController property navigationController property tabBarController property 上述控制器訪問(wèn)器都是只讀,說(shuō)明這些控制器是由內(nèi)部或初始化就進(jìn)行處理,。 從這里來(lái)看,,至少可以說(shuō)明一點(diǎn),Controller之間的關(guān)聯(lián)是存在的~~ 最關(guān)鍵,,怎么去管理視圖,? 屬性view和方法loadView UIView又如何得到它的操作者?又如何管理自身的子視圖,? 繼承于UIResponder:NSObject 如果UIView包含在UIViewController下,,只能順起獲取到對(duì)應(yīng)的UIView,暫時(shí)未知如何根據(jù)UIView獲取UIViewController UIView關(guān)于管理視圖層次,,如下: Managing the View Hierarchy superview property subviews property window property – addSubview: – bringSubviewToFront: – sendSubviewToBack: – removeFromSuperview – insertSubview:atIndex: – insertSubview:aboveSubview: – insertSubview:belowSubview: – exchangeSubviewAtIndex:withSubviewAtIndex: – isDescendantOfView: 感覺(jué)可以通過(guò)屬性window來(lái)獲取Controller,,從某一個(gè)角度來(lái)說(shuō),這個(gè)Controller應(yīng)該是當(dāng)前視圖的父對(duì)象 ======================================================================================================= 文中涉及紅色粗體,,是本文的相關(guān)答案標(biāo)記,。 UIView.window屬性來(lái)源于當(dāng)前UIApplication.keyWindow 可以通過(guò)此屬性讓UIView間接獲取到該視圖的UIViewController類(lèi) 無(wú)論生活、還是技術(shù),,一切都不斷的學(xué)習(xí)和更新~~~努力~ 分類(lèi): 其他編程 |
|