IPhone开发 用子类搞定不同的设备(iphone和ipad)
用子類(lèi)搞定不同的設(shè)備
因?yàn)橐袛辔覀兊某绦蛘\(yùn)行在哪個(gè)設(shè)備上,所以,我們的代碼有些混亂了,IF來(lái)ELSE去的,記住,將來(lái)你花在維護(hù)代碼上的時(shí)間要比花在寫(xiě)代碼上的時(shí)間多,如果你的項(xiàng)目比較大,且IF語(yǔ)句分布得到處都是,那么可以悲催地告訴你,你將在跟蹤iPad或iPhone的功能上面花更多的時(shí)間,更大的精力。
????在下面的建議中,我們不是針對(duì)iPad,而是要建立一種用傳統(tǒng)的包裝技巧來(lái)提取類(lèi)、封裝方法的思路和習(xí)慣,這樣不但會(huì)減少那些個(gè)啰哩啰嗦的條件判斷,還能使代碼結(jié)構(gòu)更加清晰。
????例如,一個(gè)更加明智的方法就是把你的類(lèi)分成三個(gè)不同的類(lèi)別,把那些兩個(gè)設(shè)備共用的代碼放在共享類(lèi)別中,把iPhone相關(guān)的代碼放在iPhone類(lèi)別中,把iPad相關(guān)的代碼放在iPad類(lèi)別中,在本節(jié)結(jié)束的時(shí)候,我們的源代碼結(jié)構(gòu)將變成下圖這樣:
????首先考慮RootViewController,這其中,我們只修改了表視圖代理的tableView:didSelectRowAtIndexPath:方法的實(shí)現(xiàn),以讓它是適應(yīng)于不同的設(shè)備,現(xiàn)在,我們就從RootViewController類(lèi)中干掉它,然后創(chuàng)建兩個(gè)子類(lèi)實(shí)現(xiàn)它。
????創(chuàng)建一個(gè)RootViewController的子類(lèi),起名為RootViewController_Pad,頭文件里面幾乎沒(méi)啥東西:
????實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單,在這里面我們將針對(duì)iPad實(shí)現(xiàn)代理方法,如果喜歡偷懶,就從RootViewController.m中把iPad對(duì)應(yīng)的代碼復(fù)制、粘貼過(guò)來(lái):
????接著,我們用類(lèi)似的方法針對(duì)iPhone創(chuàng)建RootViewController_Phone子類(lèi),不用說(shuō),該子類(lèi)的爸爸也是RootViewController類(lèi)。
????自然,其中代理方法實(shí)現(xiàn)的是iPhone功能,我們繼續(xù)發(fā)揚(yáng)復(fù)制、粘貼的精神,從RootViewContoller.m的tableView:didSelectRowAtIndexPath:方法中摘出iPhone對(duì)應(yīng)的代碼:
????通過(guò)子類(lèi)化RootViewController,我們沒(méi)費(fèi)多大勁就把iPad、iPhone的功能分離開(kāi)來(lái),從RootViewController.m中刪除tableView:didSelectRowAtIndexPath:方法。如此,超類(lèi)中包含了所有表視圖的數(shù)據(jù)源方法,而針對(duì)具體設(shè)備的功能方法,都被放在了子類(lèi)中,從而實(shí)現(xiàn)了數(shù)據(jù)與功能的分離。
????不過(guò),事兒還沒(méi)有干完,程序還不知道這些子類(lèi)的存在,我們還要把應(yīng)用代理切成iPad份和iPhone份,并讓他們分別調(diào)用相應(yīng)的子類(lèi)。
2.5?????把應(yīng)用代理分開(kāi)
?????為了調(diào)用上面的子類(lèi),我們還要做一些改動(dòng),那就是針對(duì)不同的平臺(tái)創(chuàng)建不同的應(yīng)用代理,在超類(lèi)DailyShootAppDegelate中保留這些設(shè)備共用的代碼,其頭文件如下:
????在實(shí)現(xiàn)文件中,干掉那些判斷目標(biāo)設(shè)備的代碼,稍后,我們將添加子類(lèi)的初始視圖,DailyShootAppDegelate.m的內(nèi)容如下:
????創(chuàng)建一個(gè)DailyShootDegelate_Phone類(lèi),其頭文件內(nèi)容如下:
????對(duì)于iPhone,我們要添加導(dǎo)航控制器的視圖,一添加進(jìn)來(lái)它就會(huì)在最上面顯示,然后,還要調(diào)用超類(lèi)的application:didFinishLaunchingWithOptions方法:
????類(lèi)似的,再創(chuàng)建DailyShootAppDegelate_Pad類(lèi),其頭文件內(nèi)容如下:
????在這個(gè)子類(lèi)中,需要添加一個(gè)分割視圖控制器(UISplitViewController)屬性,在實(shí)現(xiàn)中,我們將把分割視圖控制器的視圖作為頂部視圖添加進(jìn)來(lái),并在dealloc方法中釋放資源:
????到現(xiàn)在,工作基本完成,不過(guò)先別著急,我們還需要對(duì)nib文件做少許修改。在IB中打開(kāi)MainWindow.nib,用實(shí)體查看器把DailyShootAppDegelate對(duì)象的類(lèi)型改為DailyShootAppDegelate_Phone,把RootViewController對(duì)象的類(lèi)型改為RootViewController_Phone。
????類(lèi)似的,在IB中打開(kāi)MainWindow_iPad.nib,用實(shí)體查看器把DailyShootAppDegelate對(duì)象的類(lèi)型改為DailyShootAppDegelage_Pad,把RootViewController對(duì)象的類(lèi)型改為RootViewController_Pad。
????保存所有成果,生成并運(yùn)行,所有的東西將如以往那般運(yùn)行。
????為了替換兩個(gè)簡(jiǎn)單的if語(yǔ)句我們就做了這么多事情,是不是感覺(jué)很磨嘰?但是,凡事要朝好的方向想,你的代碼是不是變得清晰靈活了?其實(shí),你也許感覺(jué)做這些修改也沒(méi)有費(fèi)多少時(shí)間,但是,這么做確實(shí)很重要。
2.6?????在詳細(xì)視圖中添加一個(gè)工具條
下一步,讓我們?cè)?/span>iPad中被AssignmentViewController管理的詳細(xì)視圖的頂部添加一個(gè)工具條,豎著使用iPad時(shí),為了隱藏和顯示導(dǎo)航視圖,我們的確需要一個(gè)工具欄放置“導(dǎo)航”按鈕;即使在橫屏下,留著它也挺好,因?yàn)?#xff0c;有時(shí)候隱藏掉導(dǎo)航視圖會(huì)使界面更清晰。iPhone版本的界面已經(jīng)有個(gè)導(dǎo)航條,所以不用理會(huì)它。
我們要?jiǎng)?chuàng)建一個(gè)iPad版的AssignmentViewController,選擇“iPad組”,創(chuàng)建新文件,該文件是UIViewController的子類(lèi),記著選中“針對(duì)iPad”、“創(chuàng)建XIB”兩個(gè)復(fù)選框,且將新類(lèi)命名為AssignmentViewController_Pad。
????給AssignmentViewController_Pad類(lèi)添加名為toolbar的公共屬性,其類(lèi)型為UIToolbar,把超類(lèi)從通用的UIViewController改為AssignmentViewController。
????打開(kāi)AssignmentViewController_Pad nib,在視圖的頂部放一個(gè)UIToolbar,剩下的部分用UIWebView填充,把工具條上的默認(rèn)按鈕干掉,待會(huì)我們創(chuàng)建自己的按鈕。在UIWebView對(duì)象的屬性查看器中,把“Scales Pages”的值設(shè)置為“Fit”,從“Files’Owner”中把兩個(gè)外部接口與這些元素相連,保存。
????現(xiàn)在,在AssignmentViewController_Pad類(lèi)的實(shí)現(xiàn)文件中就沒(méi)有多少事情要做了:
????下面,我們要對(duì)MainWindow_iPad.nib做一些調(diào)整,用實(shí)體查看器把AssignmentViewController對(duì)象的類(lèi)型改為AssignmentViewController_Pad,接著,還要用屬性查看器把NIB名稱(chēng)改為AssignmentViewController_Pad,別忘了保存。
????好了,運(yùn)行運(yùn)行,看看工具條是不是出來(lái)了,下面我們將在分割視圖(橫屏)和懸浮窗體(豎屏)中使用工具條。
轉(zhuǎn)載于:https://www.cnblogs.com/zhwl/archive/2013/01/05/2846213.html
總結(jié)
以上是生活随笔為你收集整理的IPhone开发 用子类搞定不同的设备(iphone和ipad)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SQL select 语法(转)
- 下一篇: Permute 3 for mac(全能