MacOS X デスクトップアプリのHelloWorld

#開発環境
- MacOSX HighSierra(10.13.6)
- Xcode Version 9.4.1 (9F2000)
- Swift4.2
- Cocoa

#MacOS Xのアプリケーション開発について
他のサイトや記事などの情報数自体が少なく、古い。
ボタン追加もソースコードで追加なんてしているところも…:fearful:
この記事ではMain.storyboardを利用する。
古い記事によるとLabel変更は「label.text = "HellloWorld"」で変更しているが、現在のXcodeだとプロパティがないのでエラーが出る。
最新のSwift4.2は「label.stringValue = "HelloWorld"」になる。

Xcodeは不安定で操作しづらいところがある。Apple製のIDEはイマイチ。
Dash CodeというAppleのIDEがあったが、command+ZでUndoするとソースコードが消えるバグがあった。
Appleのアプリケーション開発は他の開発よりも多めに期間、工数をもらうこと。

#HelloWorldの作成
ボタンを押下するとラベルが「HelloWorld」へ変化するアプリケーションを作成する。
WindowsアプリケーションをVisual Studioでやったことある人なら難なくできる。
プロジェクト作成方法は[「MacOS X デスクトップアプリのプロジェクト作成」](https://qiita.com/iGlobo/items/37b9a7c30fe51a639df7)

#Main.storyboardの編集
- ボタンの配置

① Main.storyboardをクリックし、中央にGUI編集画面を表示させる。
② 右下にある「丸の中にある四角が入っている」アイコンをクリックし、GUI部品を表示させる。
③ フィルターに「button」を入力する。
④ 「Push Button」をドラッグ&ドロップでView Controllerにボタンを配置し、ボタンのラベルは任意に入力する。

![Xcode_mainstoryboard_button.png](https://qiita-image-store.s3.amazonaws.com/0/289168/225ed395-a204-7eec-d272-954491ad1bb9.png)

- ラベルの配置

似た手順でラベルも配置する。
![Xcode_mainstoryboard_label.png](https://qiita-image-store.s3.amazonaws.com/0/289168/21eb234f-a31e-47ec-e330-901c9e328fc8.png)

ボタンとラベルを配置ができたら、左上の「再生」ボタンでビルドが成功するか確認する。
まだボタンを押下しても反応はない。
確認が終了したら「停止」ボタンでプロセスをkillする。

#ボタンのイベントハンドラー追加
ボタンのイベントハンドラーを追加させるためXcodeを操作する。

右上にある「重なってる丸」アイコンをクリックし、中央にMain.storyboardとViewController.swiftを表示させる。(たまに違うソースファイルが表示されるので注意する。)

![xcode_btn_event1.png](https://qiita-image-store.s3.amazonaws.com/0/289168/c36c40f1-8175-6a3a-71c7-071a43ccf917.png)

ボタン部品をクリックし、右上にある「丸の中に→がある」アイコンをクリックする。
「action」にある+をViewControllerソースコードの最後にドラッグ&ドロップする。
ポップアップされたウインドウにNameを任意に入力し、イベントハンドラーメソッドを追加する。(今回はonButtonを入力した。)
![xcode_onButton.png](https://qiita-image-store.s3.amazonaws.com/0/289168/9841a020-4514-949d-ded7-da1654aea0c9.png)

追加したonButtonメソッドにprintでログを出力するようにする。


```swift:ViewController.swift
import Cocoa

class ViewController: NSViewController {
   
    //　viewDidLoad()、representedObjectを省略

    @IBAction func onButton(_ sender: Any) {
        print("ボタンが押されました。")
    }
}
```
注意として、エディタのonButton横にある二重丸はバインド設定をしているという意味になる。
![btn_bind.png](https://qiita-image-store.s3.amazonaws.com/0/289168/53f1e948-839b-4c48-aba4-bc890430af71.png)

アンバインドした場合は違う色になる。
![btn_unbind.png](https://qiita-image-store.s3.amazonaws.com/0/289168/df0728aa-b2f7-fe1a-548f-c2b78eb97aad.png)

アンバインド方法はボタン部品の「Sent Actions」の「ばつ」ボタンをクリックすればできる。
またバインドしたい場合は「+」から「onButtonメソッド」にドラッグ&ドロップして登録できる。
![btn_unbind2.png](https://qiita-image-store.s3.amazonaws.com/0/289168/643d0797-adc3-0ee3-8ba9-a10479fccff7.png)

ここでアプリケーションが正常動作するか確認する。
「再生」ボタンでデバッグ、ウインドウにあるボタンをクリックし、ログがコンソールに流れる。
確認が終わったら「停止」ボタンをクリックして終了させる。
![macosx_btn_log.png](https://qiita-image-store.s3.amazonaws.com/0/289168/bd160074-3e6a-3a07-2377-952cbd247f73.png)

ここでログに例外発生している場合は多重にアプリケーションが起動していたり、手順が間違えている。
実際にHelloWorldを作成し、確認しながらこの記事を書いているからだ。
前のプロセスをkillさせずに「再生」ボタンをクリックしたら例外発生した。

#ラベルのバインド
ボタンのイベントハンドラーと同じ要領でできる。
右クリック押し続け、またはCtrlキーを押し続けながらラベル部品からメンバ変数のところにドラッグ&ドロップで追加できる。
Nameは変数名で任意(今回はmyLblと入力)、「Connect」ボタンを押下すると「@IBOutlet weak var myLbl: NSTextField!」が追加される。
![macosx_lbl_bind.png](https://qiita-image-store.s3.amazonaws.com/0/289168/26d57919-c560-a1b5-8456-2efb09abcca6.png)

ラベルのタイトル変更するコードを追加する。

```swift:ViewController.swift
import Cocoa

class ViewController: NSViewController {
    @IBOutlet weak var myLbl: NSTextField! // Main.storyboardで追加とバインドした

    //　viewDidLoad()、representedObjectを省略

    @IBAction func onButton(_ sender: Any) {
        print("ボタンが押されました。")
        myLbl.stringValue = "HelloWorld"   // LabelからHelloWorldへ変更する
    }
}
```

ボタンをクリックすると「Label」から「HelloWorld」へ変更する。
「HelloWorld」の表示が欠ける場合はMain.storyboardのラベルを横に伸ばす。
![macosx_label_helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/289168/86d1681b-0461-3655-5003-01b17731d37c.png)


以上、フォローといいねをよろしくお願いします。