環(huán)境得搭建請(qǐng)看Part1,簡(jiǎn)單得應(yīng)用開發(fā)請(qǐng)參考下面兩個(gè)帖子
iPhone 實(shí)機(jī)開發(fā) Part 1 - HelloWorld: http://www.weiphone.com/viewthread.php?tid=222380&extra=&page=1
iPhone 實(shí)機(jī)開發(fā) Part 2 - 移動(dòng)的 View:http://www.weiphone.com/viewthread.php?tid=224718&extra=&page=1
其中我遇到了0xe800003a,codesign warning :provisioning is not application in SDK device - iphone os 2.2 ignoring還有因?yàn)楹灻麊栴}而無法編譯得問題。
其中前兩個(gè)問題是因?yàn)槟愕膍obileInstallation版本太低得緣故,替換成2.2就可以了,這邊是下載地址:http://www.weiphone.com/thread-206698-1-1.html
因?yàn)楹灻麊栴}而無法編譯通過得問題是因?yàn)樵诰幾g得時(shí)候當(dāng)詢問你是否允許簽署該簽名時(shí),你選擇了“總是允許”,不可以這樣做,只能選擇“允許”。
下面的內(nèi)容轉(zhuǎn)自Weiphone網(wǎng)最近小弟開始在研究 iPhone 的開發(fā),無奈找到的資料都是舊的,也不知道怎麼放到 iPhone 上,應(yīng)該很多人都跟我有同樣的困擾吧!經(jīng)過幾天的研究總算寫出第一個(gè) HelloWorld,而且可以不用付99元美金就可以放到實(shí)機(jī)上執(zhí)行! 今天先和大家分享怎麼放到手機(jī)上,以及基本的 Xcode 使用:
我的環(huán)境如下:
IBMX60+iDeneb 10.5.5
iPhone 港版16G+FW2.2+越獄
iPhone SDK 2.2 final
MobileInstallation 已替換(這很重要,不然沒法放到 IP 上,可以參考 weiphone 的這個(gè)帖子:http://www.weiphone.com/thread-206698-1-1.html)
注意: SDK 版本最好和 IP 版本一致!
好啦,同學(xué)們,課程開始啦!
1. 產(chǎn)生證書
由於 XCode 後面的版本都要求應(yīng)用程式必須經(jīng)過簽署,也因此你必須要
多花99美元加入 Developer Program (真是黑呀),反正我又不放到 App Store 賣錢,乾脆自己簽個(gè)證書來用不就好了
打開 Key Access 這個(gè)工具程式(在應(yīng)用程式->工具程式內(nèi)),並建立一個(gè) "iPhone Developer" 名稱的證書(這個(gè)名稱不要改,否則你得在專案內(nèi)改變)






類型選擇"編碼簽名"


輸入憑證資訊






最後選擇存放在"系統(tǒng)"內(nèi)(不是 "登入",否則會(huì)找不到)


這樣就大功告成了,你已經(jīng)省下$99了!
2. 打開 XCode 建立 View Based Application




2. 專案建立好了後,打開 Project Setting,並在 User-Defined Settings 輸入:
PROVISIONING_PROFILE_ALLOWED = NO
PROVISIONING_PROFILE_REQUIRED = NO


3. 打開 Info.plist,這個(gè)檔案主要存放應(yīng)用程式的相關(guān)描述,按右鍵 Add Row,新增 SignerIdentity = "Apple iPhone OS Application Signing" (要一樣的,亂輸好像不行)


4. 打開 MainWindow.xib 檔案,並雙擊 Window 這個(gè)圖標(biāo),我們可以看到 iPhone 內(nèi)唯一的一個(gè) Window


5. 加入我們自己的 View,在 Class Identity(切換到最右邊的 Tab) 輸入 MyView 按下回車鍵


6. 同樣的我們拉進(jìn)一個(gè) UILabel 和 UIButton,並調(diào)整一下 Label 的屬性,這邊 Autosizing 的調(diào)整還蠻容易懂的,大家可以試著調(diào)整看看就知道了


7. 畫面弄好了,但是還沒有把我們的 View 和 ViewController 建立連接,點(diǎn)選 HelloWorld View Controller 後可以在菜單內(nèi)的 Tools->Connections Inspector 看到和 View Controller 連接的 Outlet(也就是類裡面的變量),連接的方法是把 outlet 內(nèi)的view 拖拉到我們實(shí)際建立的 View


8. 接著我們?cè)诮⒑玫?View 新增一個(gè) outlet(lbl) 和 action(clickMe),這樣我們才可以改變 Label 這個(gè)物件,並分別把 outlet 連接到 HelloWorld 這個(gè)實(shí)際的 Label,action 連接到 "點(diǎn)我" 這個(gè)按鈕,並選擇 Touch Down 的事件,稍後我們會(huì)用到這個(gè)事件來改變 Label




9. 連接關(guān)係都建立好了,我們要產(chǎn)生實(shí)體的類,XCode 會(huì)幫我們把必要的 code 產(chǎn)生,產(chǎn)生的方法是在 File->Write Class Files


10.接下來我們加上一些代碼,分別打開MyView.h(注意要在 MyView 後面輸入 UIView,Xcode 不會(huì)加上)和MyView.m並輸入下面代碼






值得一提的是你可以在寫的過程中按 CTRL+"<" 看到提示
11. 選擇要使用的設(shè)備,在此我們選擇 Device - iPhone OS 2.2,XCode 會(huì)幫我們簽署,按下"允許"(不能按"總是允許")就可以輸出到你的iPhone了(第一次跑可能會(huì)出現(xiàn) Security policy error,再跑一次
就不會(huì)出現(xiàn)了)


12. 要?jiǎng)h除模擬器或?qū)嶓w機(jī)上的 Ap, 只要按住圖標(biāo)不放就可以了

13. 來個(gè)實(shí)體和虛擬機(jī)的合照吧,點(diǎn)"按我"可以改變 Hello World 的顏色



2008-12-13 13:53
下課了~
可能還有些同學(xué)沒有完成第一課的進(jìn)度,沒關(guān)系,歡迎這些同學(xué)用 QQ 和我聯(lián)系(QQ:865099857),希望日後有機(jī)會(huì)能夠與大家一起合作,目前我人回臺(tái)灣了,不過大部分時(shí)間會(huì)在深圳,明年希望有機(jī)會(huì)和深圳的 IP 迷們一起聚會(huì)討論. 抱歉我使用繁體中文,雖然我看得懂簡(jiǎn)體字,不過不是所有的字都能認(rèn)識(shí),為避免造成筆誤,或是用語上的不同,我還是使用自己習(xí)慣的繁體,相關(guān)用語上我盡量使 用大家可以接受的,如果有發(fā)現(xiàn)奇怪的用語的,請(qǐng)大陸的朋友不吝指正.
在第一課,我們學(xué)會(huì)了怎麼自己產(chǎn)生證書,拿它來簽署我們寫的無聊程式(好吧!我承認(rèn)那個(gè) HelloWorld 實(shí)在沒什麼用處). 我們也知道怎麼把 UI 和 變量連結(jié)起來,但是可能很多人對(duì)於裏面那些名詞,包括 View,Controller,Delegate 搞得一頭霧水,在第二課開始之前,我們有必要把這些東西搞懂:
View:
這個(gè)名詞相信大多數(shù)的朋友都知道了,你可以在 View 上面畫畫,可以在上頭放一些控件,甚至可以把一個(gè) View 放到另外一個(gè) View 裏面,所有的 View 都來自於 UIView 這個(gè)類,而 UIView 又來自於 UIResponder,如果你看一下 Apple 的文檔,大概就可以知道 UIResponder 主要工作在於處理事件的. View 的外框我們稱為 frame,我們透過這個(gè) frame 來定義 View 的大小位置(例如:[view setFrame:frame]),至于要把一個(gè) View 加到另一個(gè) View 則可以用 [view addSubView:subView]
Controller:
在 XCode 產(chǎn)生代碼你會(huì)發(fā)現(xiàn)有一個(gè)繼承自 UIViewController 的類.甚至打開 MainWindow.xib 也可以看到它的蹤影. 也許有同學(xué)會(huì)以為這個(gè)和 MVC 裏面的 "C" 是同一個(gè)東東,其實(shí) UIViewController 只是幫你控制 View 的 Layout,例如當(dāng)你旋轉(zhuǎn) iPhone 時(shí),Controller 要幫你處理 View 的位置,另外像 View 與其他控件如 Toolbar 間的位置控制也是他的傑作. 當(dāng)然Controller 並不是必要的,你也是可以用 View 就來完成同樣的事.
Delegate:
Delegate 這個(gè)名詞相信大家都常看到吧,這東西有點(diǎn)像是現(xiàn)代孝順兒子的父母一樣,父母親擔(dān)任 Delegate(代理)幫兒子寫家庭作業(yè). 所有與用戶的互動(dòng)都會(huì)交給 Delegate 來處理,這樣子好處是可以把畫面與事件的處理分開,通常我們是以 Controller 來擔(dān)任 Delegate 的角色.
好了,看到這邊是不是有點(diǎn)了解又不太了解呢? 是的,我們只解釋了這些名詞,但是一個(gè) iPhone 的程式是怎麼開始動(dòng)起來的,這時(shí)候建議大家先產(chǎn)生一個(gè)應(yīng)用程式看看,並且打開 MainWindow.xib 找到 File's Owner 後看看他的 Delegate 是什麼? 我們尋著線索找下去應(yīng)該是 XXXAppDelegate,打開後大致上可以看到以下代碼片段:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
首先映入眼簾的是 UIApplication 這個(gè)類,我們都知道 iPhone 要求同時(shí)間只能有一個(gè) Application 執(zhí)行,因此每個(gè)應(yīng)用程式都會(huì)對(duì)應(yīng)到一個(gè) UIApplication,我們可以用 [UIApplication sharedInstance] 來取得所對(duì)應(yīng)的應(yīng)用程式實(shí)例(instance),當(dāng)你執(zhí)行你的應(yīng)用程式後applicationDidFinishLaunching 就會(huì)被呼叫到(記得我們上面談到 Delegate 這個(gè)可憐的父母吧,事件傳給了他,由 Delegate 來處理事件)接著我們把 view 加到 window(其實(shí)他也是個(gè) view),然後讓這個(gè) window 變成可見的. 好了,如果你有興趣,最好能夠把 MainWindow.xib 內(nèi)的每一個(gè)圖標(biāo)打開來看看(File's Owner,First Responder,XXXController...),然後追蹤一下他們的 delegate,相信你能了解的更多.
前面講了這麼多無非是希望同學(xué)們?cè)诳聪旅娴奈恼聲r(shí)不會(huì)雞同鴨講的,我們今天要講的主題就是 View,還會(huì)談到如何把一個(gè) View 動(dòng)態(tài)加到另一個(gè) View 裏面,如何使用圖片,設(shè)定應(yīng)用程式的圖標(biāo),以及 touch 事件的處理等等.
今天的例子多了些動(dòng)態(tài)效果,主要是讓你在雙點(diǎn)擊屏幕時(shí)會(huì)出現(xiàn)一朵花,如果你把手指放在花上面,還可以拖拉著到處跑,而且拉動(dòng)的時(shí)候花還會(huì)變亮,放開後花會(huì)變暗,也許它還是很無聊的東西,不過這個(gè)例子比起 HelloWorld 好玩多了:
1. 產(chǎn)生一個(gè) View-Based Application,並存為 DragView




2. 打開 MainWindow.xib,並點(diǎn)選 Loaded From "DragViewViewController.nib" 以開啟真正的 UIView,切換到 Class Identity 後輸入MainView(名稱可自訂)按回車鍵,接著 Write Class Files 以產(chǎn)生實(shí)體的類檔案




3. 打開 MainView.h 並在後面加上 UIView (我一直不了解為什麼 XCode 不幫我們加上?)


4. 從 Library 裏面拉一個(gè) UIImageView 進(jìn)來


5. 點(diǎn)選這個(gè) UIImageView 並在菜單上打開 Inspector,在 Class Identity 改為 DraggedView (記得按回車鍵)


6. 同樣的 Write Class Files 以產(chǎn)生實(shí)體的類檔案


7. 記得修改一下 DraggedView.h 加上 UIImageView (很容易忘記的),並加上 start 這個(gè)變量,它會(huì)記錄我們開始接觸的那一點(diǎn):


好了,到目前為止,畫面算是弄好了,大家可以先在模擬器跑跑看會(huì)不會(huì)發(fā)生編譯錯(cuò)誤... 接下來我們要介紹在 UIView 裏面的 touch 的事件:
- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event
- (void) touchesMoved:(NSSet *) touches withEvent:(UIEvent *) event
- (void) touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event
這三個(gè)照字面上意思解釋應(yīng)該不難了解,分別代表接觸點(diǎn)開始,移動(dòng),結(jié)束的事件,後面的 touches 代表接觸的點(diǎn)(因?yàn)槭嵌帱c(diǎn)接觸所以可能包括多個(gè)點(diǎn)),event 代表接觸的事件
8. 打開 MainView.m 輸入以下代碼,這個(gè) MainView 是我們最底層的 View,還記得我們講到的 frame 吧,在這邊派上用場(chǎng)了,值得注意的是我這邊特別是用到建構(gòu)子(Constructor),默認(rèn)的形態(tài)是 -(void) init 且不帶參數(shù)的,我們?cè)?MainView 被產(chǎn)生時(shí)把他的背景設(shè)定為黑色的:


9. 打開 DraggedView.m 輸入以下代碼,我們?cè)?touchesBegan 時(shí)先記錄開始的位置,然後用 setAlpha 讓這個(gè) View 變亮(<=1.0f),在 touchesMoved 時(shí)計(jì)算移動(dòng)後的位置,用 setFrame 來改變圖片的位置,這樣子看起來圖片好像跟著我們動(dòng)了


10. 現(xiàn)在還不能執(zhí)行,因?yàn)槲覀兊膱D片還沒有加到 Resource 裏面,隨便找一張你喜歡的圖把它拉到 Resources 裏面,勾選 Copy items into...




11. 這個(gè)圖片還有其他用途,可以用來作為我們的應(yīng)用程式圖標(biāo),打開 Info.plist,在 Icon file 輸入 images.jpg


12. 最後為了讓這個(gè)應(yīng)用程式可以在 iPhone 上跑,我們修改了 Project Setting 和 Info.plist (詳細(xì)情形可以看第一課)




13. 看看是不是可以跑起來了,隨便在任意地方雙敲擊兩下看看是不是有朵花跑出來,再用手指移動(dòng)這些花看看,哇!這次總算像是個(gè) iPhone 的應(yīng)用程式了(雖然那張圖處理的不是很好)!


跟實(shí)體機(jī)器比較看看...(呵呵,我是用臺(tái)灣大哥大的,信號(hào)強(qiáng)呀!)


---------------------------------------------------------
專注移動(dòng)開發(fā)
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian