图片
本次教學目標: 建立一個簡單的計時器 使用 NSTimer 定期更新畫面文字 操作環境: OS X Version 10.9.1 Xcode Version 5.0.2 (5A3005) 在本教學中,我們將藉由撰寫一個計時器,學到如何使用 NSTimer 定期呼叫方法執行。

建立 OS X Application 專案

這次我們建立一個名為 HelloTimer 的專案 請參考教學 OS X APP Part1 Hello World 建立新專案 點選前往OS X App Part1 - Hello World
图片
图片
對 HelloTimer Group 點擊右鍵,點擊 New Group 建立新 Group,用來整理專案檔案。
图片
建立 Resources 與 Controllers 兩個 Group。
這次我們要建立一個 WindowController,用來管理 Window 上的事件。 讓 AppDelegate 裡的邏輯只負責程式啟動與停止的。
图片
對 HelloTimer Group 點擊右鍵,點擊 New File… 建立新的檔案。
图片
於左側選單選擇 OS X 下的 Cocoa,在右側選單選擇 Objective-C class,點擊 Next。
图片
Class 欄位輸入:MainWindowController Subclass of 欄位輸入:NSWindowController 勾選 With XIB for user interface 輸入完成後點擊 Next。
图片
點擊 Create。
图片
點擊 Skip。
图片
以上的動作所產生的三個檔案。
图片
拖拉檔案,將 MainWindowController.h/.m 移至 Controllers 底下。 將 MainMenu.xib,MainWindowController.xib 移至 Resources 底下。 建立 Group 是管理專案的程式檔非常好的用的方式。

設計版面(layout)

這一次的 Window 將在 MainWindowController.xib 設計,所以我們要將 MainMenu.xib 中的 Window 元件刪除。
图片
點選 MainMenu.xib,在設計畫面點選 Window - HelloTimer,按下鍵盤上的 delete。
图片
在 MainMenu.xib 中移除了 Window 元件。
图片
點選 MainWindowController.xib,在設計畫面中選擇 Window - Window。
图片
本教學不使用自動佈局來配置版面原件。請於右側選單切換至最左側頁面,取消勾選 Use AutoLayout。
图片
從右下角選擇 Label 元件拖曳至 Window 中,並調整至適當大小。
图片
於右邊切換至屬性頁面。
Title 欄位輸入:00:00。 Alignment 選擇置中。 Font 將字體調整到適當大小。
图片
從右下角選擇 Bevel Button 元件拖曳至 Window 中。
图片
於右邊切換至屬性頁面,將 Type 欄位改成 On Off。

編寫邏輯

接下來將開始編寫程式碼了。bearAppDelegate.h
bearAppDelegate.m
接下來測試一下程式是否會顯示新設計的視窗畫面。 按下鍵盤上的 Command + Shift + K,清除專案之前編譯的檔案。 按下鍵盤上的 Command + R,編譯並執行程式。
图片
顯示新設計的視窗畫面。
再來要撰寫 MainWindowController 相關的程式碼,先說明一下本次教學的計時器的主要流程如下圖:
图片
當點擊 Bevel Button 時會呼叫 handleClick: 方法,透過取得 Bevel Button 的 state 特性,來呼叫相對應的方法。 state 為 Off 就呼叫 stop: 方法停止計時;state 為 On 就呼叫 start 方法。 start 方法會進行計時器歸零,並定期呼叫 update 方法更新顯示在視窗的時間。 要定期呼叫方法執行,我們可以使用 NSTimer 類別。 本教學中,主要使用 NSTimer 類別的三個方法: scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: isValid invalidate 1.首先要呼叫 scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: 建立 NSTimer 物件:
2.要停止 NSTimer 物件繼續執行時,需要先用 isValid 檢查該 NSTimer 物件是否可以停止。 3.呼叫 invalidate 停止 NSTimer。 以下便是 MainWindowController 類別的相關程式碼: MainWindowController.h
MainWindowController.m

連接元件

图片
點選 MainWindowController.xib,在設計視窗中對 File’s Owner 點擊右鍵。
图片
點擊 timerTextFiled 的圈不放,拖曳至 Label 放開。 點擊 handleClick: 的圈不放,拖曳至 Bevel Button 放開。

測試結果

接下來測試一下完成的程式。 按下鍵盤上的 Command + Shift + K,清除專案之前編譯的檔案。 按下鍵盤上的 Command + R,編譯並執行程式。
图片
初始畫面。
图片
按下按鈕,開始計時。
图片
按下按鈕,停止計時。
图片
再次按下按鈕,歸零重新計時。

後續討論

在 MainWindowController.m 中,我們可以發現我們在 update 方法中處理顯示時間的格式。 要如何呈現資料其實並不是 WindowController 的職責,而是 NSTextField 該負責的。
在下一次的教學,我們將會將時間格式化的部分移到對應的類別中作處理。關於這次的Sample Code 下載: https://github.com/TakoBear/OSXHelloTimer1

參考

更多Mac App 教學請前往:Bear Mac開發教學大全喜歡這篇文章嗎? 趕快加入Takobear粉絲團吧!