2009年7月1日 星期三

使用 Cocoa 建構 Hello World!!

在此分享如何使用 Xcode3 建構一個Cocoa Application.
例子當然是世界名著 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 來處理這個事件。

同樣的方式 我們拉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 比較適合,所以在做的時候,記得用一樣的名稱。
*/


最後,上面步驟,或是說明有不正確的地方,還請教導一下。因為我也是新手啦!
哈哈哈~~!! 祝大家玩的愉快。

沒有留言: