例子當然是世界名著 Hello world. 如果底下說明有不正確的地方,還請麻煩告知。
當然 XCode3 要先裝好…然後打開它點選一下New Project吧!
1. 我們這次要建構一個Cocoa Application,如下圖,
選取之後我們就命名它為Hello World, 及我們所要擺放資料夾的位置。
(這個步驟就自行發揮)
2. 接著我們可以見到XCode 的主畫面如下,
紅色字體的部份就是我們以後的Hello World application.
如果有成功的build project 就可以見到它會轉變為黑色的字體。
3. 我們先必需在這個Application中新增一個自己的Subclass,
在Class 資料夾上面按右鍵,選取Add -> New File.
4. XCode 會要求我們選擇所需要的種類的檔案,我們這次選取 Objective-C Class
因為小弟一直都習慣使用C, Objective-C 對我而言是個比較快可以入門的方式。
5. 接著我們必需命名我們的檔名,通常檔名即我們Class 的名字,
在這邊我們給它為"appCntrl", 即為 Application Controller
6. XCode 的部份先告一段落,我們從XCode 中選取 MainMenu.xib(或 MainMenu.nib)
其實是指同樣的東西,以後有機會再來討論中間的差異。
雙擊 xib 後,會帶出Interface Builder,這是決定 Application Layout的工具,
其中可以看到如下圖的視窗,然後我們必需從Library 中拉NSObject至這個window中,
它會生成一個"Object"的圖示。
6. 再來要對這個"Object"做些設定的動作,先選取 "Object"圖示,然後到Inspector window中,
點選 i 這頁後,在上方Class 的部份,我們打入我們的"appCntrl"。
(如果找不到,可以試著做看看從File底下Read Class files的動作後,再來找看看)
6. 接著這個部份就自行發揮,在Window 上面加上Label & Button,如下圖,
7. 有了可收事件 跟顯示資訊的元件後,我們回到inspector, 先點我們新加的Objec, 再至 i 這個頁面,
我們在Outlet & Action 這兩個部份各加入ID,名稱的部份是可以變更的。(這部份我並沒有修改)
在最底下Name 的欄位填入"appCntrl" 這樣可以識別至XCode中的appCntrl Class.
做完上面的設定後,至File 底下執行 Write class file 的動作,
它可能會問是是要replace 還是merge 這個就見人見智了。
/// 小說明一下,這個動作會將剛新增的 Oulet/Action 加到 appCntrl.h & .m 檔案中。
/// 你可以換成在Xcode 中自己手動新增,然後在Interface Builder 中從read class file的動作中讀進來。
8. 在Window 上面我們配置了 Label & Button 兩個元件後,
我們必需把它們跟自己新增 appCntrl Class 中的 Outlet 及 Action 做個連接。
/// 如果你把Outlet 想像成 output, Action 想像成 input,就可以理解成,
/// 我們會從 Button 收下mouse click 的事件,然後傳到 appCntrl Object,
/// 經過我們的處理後,再把資訊呈現至 Outlet 上面。
/// (使用 appCntrl Object的原因,是Object 為實體,Class 只是個宣告類別)
/// 那連接的動作如何完成,如果是A要丟東西給B ,就選取A 按下Control 鍵拉至B 上面。
/// 如下面的動作,選取 Button 按下 Control 拉至 appCntrl ,
/// IB(interface builder)會跳出視窗要求選取處理事件的 "Method" (也可看成Funtion啦)
/// 當然我們就選取自己新增的 myAction1 來處理這個事件。
它可能會問是是要replace 還是merge 這個就見人見智了。
/// 小說明一下,這個動作會將剛新增的 Oulet/Action 加到 appCntrl.h & .m 檔案中。
/// 你可以換成在Xcode 中自己手動新增,然後在Interface Builder 中從read class file的動作中讀進來。
8. 在Window 上面我們配置了 Label & Button 兩個元件後,
我們必需把它們跟自己新增 appCntrl Class 中的 Outlet 及 Action 做個連接。
/// 如果你把Outlet 想像成 output, Action 想像成 input,就可以理解成,
/// 我們會從 Button 收下mouse click 的事件,然後傳到 appCntrl Object,
/// 經過我們的處理後,再把資訊呈現至 Outlet 上面。
/// (使用 appCntrl Object的原因,是Object 為實體,Class 只是個宣告類別)
/// 那連接的動作如何完成,如果是A要丟東西給B ,就選取A 按下Control 鍵拉至B 上面。
/// 如下面的動作,選取 Button 按下 Control 拉至 appCntrl ,
/// IB(interface builder)會跳出視窗要求選取處理事件的 "Method" (也可看成Funtion啦)
/// 當然我們就選取自己新增的 myAction1 來處理這個事件。
同樣的方式 我們拉appCntrl 至Label 上面,把它指定為 myOutlet1.
9. 在inspector window 上面 我們可以看到完成的結果。
10. 在IB 存檔完,它的工作就先告一段落了,接下來要自己動手打點程式了。
(終於有程式了...)
先來看看appCntrl.h 的內容,
#import <Cocoa/Cocoa.h> @interface appCntl : NSObject { IBOutlet id myOutlet1; } - (IBAction)myAction1:(id)sender; @end/// 這個部份,就是剛我們在IB做完那些動作,按下 Write class file就會幫我們加進來的。
/// 如果一開始在這邊自己動手加程式,也可以反過來在 IB 用 read class file 放進 IB.
/// 小弟比較懶惰~~所以我選擇打字比較少的動作。
/// 不是說要打些程式碼嗎?怎麼上面不需要…嘿嘿…
/// 接下來在 appCntrl.m 中我們就就要輸入底下這些東西…
找到myAction1: (id)sender { } 這個段落中,加入你所沒有那段程式。
#import "appCntl.h" @implementation appCntl - (IBAction)myAction1:(id)sender { static Boolean shownHello = FALSE; if (FALSE == shownHello) { [myOutlet1 setStringValue:@"Hello world!"]; shownHello = TRUE; } else { [myOutlet1 setStringValue:@""]; shownHello = FALSE; } } @end/// 這邊先不解釋這些 有點像C 又不太像C 的 Objective-C 的語法。
/// 小弟只想先快速地建構起一個hello world 示範程式。
打完程式後,我們按下 Build & Go 就等著程式跳出來囉!
(如果沒有Compiler error 的話,真的不幸跑出來的話,再把msg 貼上來,再來看看怎麼解)
首先是這樣的畫面,
然後按下Button 後,"Hello World!!"就會顯示
再接著按一下Button ,Hello World 就消失不見,一直重覆做出現不見的事情。
(有點小白痴,但它可以動了。:D)
希望 這篇有幫到你了解整個建構Application 的流程,
當然中間 Objective-C的那段程式碼沒有解釋,先留待下回小弟充板面的內容吧!
/*
** 另外,appCntrl & appCntl 是都指一樣的東西,因為小第太懶的再重新抓一次圖
** 但又覺得名字應該用 appCntrl 比較適合,所以在做的時候,記得用一樣的名稱。
*/
最後,上面步驟,或是說明有不正確的地方,還請教導一下。因為我也是新手啦!
哈哈哈~~!! 祝大家玩的愉快。
沒有留言:
張貼留言