本次教學目標:
建立一個簡單的計時器
使用 NSTimer 定期更新畫面文字
操作環境:
OS X Version 10.9.1
Xcode Version 5.0.2 (5A3005)
在本教學中,我們將藉由撰寫一個計時器,學到如何使用 NSTimer 定期呼叫方法執行。
建立一個簡單的計時器
使用 NSTimer 定期更新畫面文字
操作環境:
OS X Version 10.9.1
Xcode Version 5.0.2 (5A3005)
在本教學中,我們將藉由撰寫一個計時器,學到如何使用 NSTimer 定期呼叫方法執行。
建立 OS X Application 專案
這次我們要建立一個 WindowController,用來管理 Window 上的事件。
讓 AppDelegate 裡的邏輯只負責程式啟動與停止的。
讓 AppDelegate 裡的邏輯只負責程式啟動與停止的。
Class 欄位輸入:MainWindowController
Subclass of 欄位輸入:NSWindowController
勾選 With XIB for user interface
輸入完成後點擊 Next。
Subclass of 欄位輸入:NSWindowController
勾選 With XIB for user interface
輸入完成後點擊 Next。
拖拉檔案,將 MainWindowController.h/.m 移至 Controllers 底下。
將 MainMenu.xib,MainWindowController.xib 移至 Resources 底下。
建立 Group 是管理專案的程式檔非常好的用的方式。
將 MainMenu.xib,MainWindowController.xib 移至 Resources 底下。
建立 Group 是管理專案的程式檔非常好的用的方式。
設計版面(layout)
這一次的 Window 將在 MainWindowController.xib 設計,所以我們要將 MainMenu.xib 中的 Window 元件刪除。
Title 欄位輸入:00:00。
Alignment 選擇置中。
Font 將字體調整到適當大小。
Alignment 選擇置中。
Font 將字體調整到適當大小。
編寫邏輯
接下來將開始編寫程式碼了。
bearAppDelegate.h
bearAppDelegate.h
bearAppDelegate.m
接下來測試一下程式是否會顯示新設計的視窗畫面。
按下鍵盤上的 Command + Shift + K,清除專案之前編譯的檔案。
按下鍵盤上的 Command + R,編譯並執行程式。
按下鍵盤上的 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 物件:
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
3.呼叫 invalidate 停止 NSTimer。
以下便是 MainWindowController 類別的相關程式碼:
MainWindowController.h
MainWindowController.m
連接元件
點擊 timerTextFiled 的圈不放,拖曳至 Label 放開。
點擊 handleClick: 的圈不放,拖曳至 Bevel Button 放開。
點擊 handleClick: 的圈不放,拖曳至 Bevel Button 放開。
測試結果
接下來測試一下完成的程式。
按下鍵盤上的 Command + Shift + K,清除專案之前編譯的檔案。
按下鍵盤上的 Command + R,編譯並執行程式。
按下鍵盤上的 Command + Shift + K,清除專案之前編譯的檔案。
按下鍵盤上的 Command + R,編譯並執行程式。
後續討論
在 MainWindowController.m 中,我們可以發現我們在 update 方法中處理顯示時間的格式。
要如何呈現資料其實並不是 WindowController 的職責,而是 NSTextField 該負責的。
要如何呈現資料其實並不是 WindowController 的職責,而是 NSTextField 該負責的。
參考