本次教學目標:
修改 上次教學Part2 的計時器程式碼
了解 NSTextField 與 NSTextFieldCell 的關係
了解 NSFormatter 與其子類別的用法
操作環境:
OS X Version 10.9.1
Xcode Version 5.0.2 (5A3005)
在上回教學的後續討論提到我們讓 MainWindowController 做太多事情了,這一次我們將顯示文字的細節部分移交出去,讓 MainWindowController 只負責指示何時更新繪圖。
修改 上次教學Part2 的計時器程式碼
了解 NSTextField 與 NSTextFieldCell 的關係
了解 NSFormatter 與其子類別的用法
操作環境:
OS X Version 10.9.1
Xcode Version 5.0.2 (5A3005)
在上回教學的後續討論提到我們讓 MainWindowController 做太多事情了,這一次我們將顯示文字的細節部分移交出去,讓 MainWindowController 只負責指示何時更新繪圖。
建立 OS X Application 專案
NSTextField 與 NSTextFieldCell 的關係
在這邊 Bear 先講講 NSTextField 與 NSTextFieldCell。
NSTextFieldCell 繼承了 NSCell 類別,主要負責是處理文字與背景的繪圖。
NSTextField 繼承了 NSControl 類別,主要負責互動,也提供了與 NSTextFieldCell 相同的介面,可以透過 NSTextField 設定 NSTextFieldCell。
簡單來說,如果需要自訂點擊事件,就是要繼承 NSTextField 實作,而自訂顯示繪圖就是繼承 NSTextFieldCell 實作。
而本次教學是要講自訂顯示字串格式的部分。
NSTextField 繼承了 NSControl 類別,主要負責互動,也提供了與 NSTextFieldCell 相同的介面,可以透過 NSTextField 設定 NSTextFieldCell。
簡單來說,如果需要自訂點擊事件,就是要繼承 NSTextField 實作,而自訂顯示繪圖就是繼承 NSTextFieldCell 實作。
而本次教學是要講自訂顯示字串格式的部分。
新增類別
接下來要新增一個繼承 NSTextFieldCell 的類別,並將設計視窗中的 Text Field Cell的類別改成我們自訂的類別。
Class 欄位輸入:TimerTextFieldCell
Subclass of 欄位輸入:NSTextFieldCell
輸入完成後點擊 Next。
Subclass of 欄位輸入:NSTextFieldCell
輸入完成後點擊 Next。
編寫邏輯
這次教學中我們提到我們要將格式化的部分移到 TimerTextFieldCell 處理。
說到格式化就會講到有個用來處理字串格式化叫做 NSFormatter 的類別,它的主要方法為 stringForObjectValue:,藉由判斷傳進來參數的類別,而產生不同對應的格式化字串回傳。
本次教學是需要將 NSDate 格式化成字串,剛好有個 NSDateFormatter 的類別專門用來將 NSDate 格式化成字串。
TextFieldCell 可以透過 setFormatter: 來設定 NSFormatter 類別的物件,以下便是相關的程式碼:
TextFieldCell 可以透過 setFormatter: 來設定 NSFormatter 類別的物件,以下便是相關的程式碼:
再來是修改 MainWindowController 的 update 方法:
連接元件
接下來我們修改版面上 TextFieldCell 的類別:
測試結果
接下來測試一下完成的程式。
按下鍵盤上的 Command + Shift + K,清除專案之前編譯的檔案。
按下鍵盤上的 Command + R,編譯並執行程式。
照理說執行結果會跟上篇教學一樣。
按下鍵盤上的 Command + Shift + K,清除專案之前編譯的檔案。
按下鍵盤上的 Command + R,編譯並執行程式。
照理說執行結果會跟上篇教學一樣。
後續討論
如果想自己實作 NSFormatter 的子類別,依本次教學的需求,以下寫個 TimerFormatter 的範例。新建繼承 NSFormatter 的類別叫做 TimerFormatter,並在 TimerFormatter.m 中覆寫 stringForObjectValue: 方法:
修改 TimerTextFieldCell.m
存檔後,按下鍵盤上的 Command + Shift + K,清除專案之前編譯的檔案。
按下鍵盤上的 Command + R,編譯並執行程式。
也會得到相同的執行結果。
關於這次的Sample Code 下載:
https://github.com/TakoBear/OSXHelloTimer2
按下鍵盤上的 Command + R,編譯並執行程式。
也會得到相同的執行結果。
關於這次的Sample Code 下載:
https://github.com/TakoBear/OSXHelloTimer2
參考
NSTextField Class Reference
NSTextFieldCell Class Reference
NSFormatter Class Reference
NSDateFormatter Class Reference
喜歡這篇文章嗎? 更多Mac教學請點此處前往
Takobear粉絲人數突破1500人!! 更多有趣消息請加入Takobear粉絲團喔!
NSTextFieldCell Class Reference
NSFormatter Class Reference
NSDateFormatter Class Reference
喜歡這篇文章嗎? 更多Mac教學請點此處前往
Takobear粉絲人數突破1500人!! 更多有趣消息請加入Takobear粉絲團喔!