初心者がXamarin.Macを使うとこうなる

#自己紹介

C#始めて、６ヶ月弱、Xamarin触れ始めて4ヶ月弱
社会人１年生の@Takkiii0204と申します。以後よしなに。
はじめに、この記事は、
[[初心者さん・学生さん大歓迎！] Xamarin その2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/xamarin-welcomem)の18日目の記事になります。
初心者であり、戦闘力0なので、間違いがありましたらご指摘の程、よろしくお願いします。

#Xamarin.Macで開発することに…
そもそもXamarin.Macとはなにか？と言いますとネイティブMacアプリケーションをC#で書けるというものです。
詳しく知りたい方はXamarin.Macの人こと、@ailen0ada さんの記事をご覧ください！

<iframe src="//www.slideshare.net/slideshow/embed_code/key/2ZjKkOZ7JYuxBx" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/ailen0ada/xamarinmac-46877552" title="Xamarin.Mac をこれからはじめるあなたへ" target="_blank">Xamarin.Mac をこれからはじめるあなたへ</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/ailen0ada">Tsubasa Hirano</a></strong> </div>

開発するにあたった経緯は、
1．社内用のMacアプリケーションを作って欲しいと要望があったこと
2.私の書ける言語がC#しかないこと
となります。WPFのアプリケーションのコードが読めるようになってきたので、大丈夫かなと思ったのですが、かなり苦戦しております。（現在進行形）

今回は、苦労したことの中からを1つだけ記事に書きます!

#苦労したこと NSTableViewの作成

まず、最初に画面にNSTableViewを貼り付けます。Main.storyboardをクリックして、xcodeを起動しましょう。
ViewControllerにNSTableViewを配置します。
![スクリーンショット 2016-12-18 1.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/153907/3c05f935-b8cd-e8ab-6709-32358a3fd46c.png)


Collumnの幅や、タイトルを設定します。今回は名前と年齢にしました。

![スクリーンショット 2016-12-18 0.54.35.png](https://qiita-image-store.s3.amazonaws.com/0/153907/02217238-4eca-4c55-0684-8a39a27a7d25.png)


あとTableColumnのIdentifierもです。
今回は名前のColumnをName、年齢のColumnをAgeにします。

![スクリーンショット 2016-12-18 0.19.40.png](https://qiita-image-store.s3.amazonaws.com/0/153907/2d9d92eb-1cef-cea9-c9fd-376426fee2f9.png)


![スクリーンショット 2016-12-18 1.24.02.png](https://qiita-image-store.s3.amazonaws.com/0/153907/3a794629-1e11-5fdb-43a2-71149928c573.png)


OutletはModelTableViewとしておきます。

![スクリーンショット 2016-12-18 0.30.12.png](https://qiita-image-store.s3.amazonaws.com/0/153907/79db8dd6-a92e-e4b4-1d51-8ff871e89d74.png)

次は、列に表示したいModelを用意します。

```csharp:Model.cs
public class Model
{
	public string Name { get; set; }
	public string Age { get; set; }
}
```
次に、行となるデータソースを用意します。NSTableViewDataSourceを継承してGetRowCountメソッドをオーバーライドさせます。

```csharp:ModelTableViewDataSource.cs
public class ModelTableViewDataSource : NSTableViewDataSource
{
	public List<Model> DataSource { get; set; } = new List<Model>();

	public override nint GetRowCount(NSTableView tableView)
	{
		return DataSource.Count;
	}
}
```

次にDelegateを用意します。NSTableViewDelegateを継承させます。今回のテーブルには、TextViewCellに値を入れていくので、TextFieldを設定するメソッドを用意します。

```csharp:ModelTableViewDelegate.cs
public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row)
{
	var view = tableView.MakeView(tableColumn.Identifier, this);
	switch (tableColumn.Identifier)
	{
		case "Name":
			var name = (NSTableCellView)view;
			ConfigureTextField(name, row);
			name.TextField.StringValue = viewSource.DataSource[(int)row].Name;
			name.TextField.Tag = row;
			return name;
		case "Age":
			var age = (NSTableCellView)view;
			ConfigureTextField(age, row);
			age.TextField.StringValue = viewSource.DataSource[(int)row].Age;
			age.TextField.Tag = row;
			return age;
	}
	throw new Exception("例外処理を書く");
}
```

最後にViewController.csの中のViewDidLoadメソッドの中にModelTableViewに先ほど作成したDataSource、Delegateを入れます。

```csharp:ViewController.cs
public override void ViewDidLoad()
{
	base.ViewDidLoad();
	var dataSource = new ModelTableViewDataSource();
	dataSource.DataSource.Add(new Model { Name = "ken", Age = "20" });
	dataSource.DataSource.Add(new Model { Name = "Bob", Age = "22" });
	dataSource.DataSource.Add(new Model { Name = "Green", Age = "28" });
	ModelTableView.DataSource = dataSource;
	ModelTableView.Delegate = new ModelTableViewDelegate(dataSource);
}

```
実行すると…

![スクリーンショット 2016-12-18 0.49.22.png](https://qiita-image-store.s3.amazonaws.com/0/153907/2702c45f-02f3-b6c5-a974-1e7dd32403c1.png)

うまく表示できました！

#まとめ
NSTableViewにデータを表示させるのに、２週間弱かかりました。調べ方が下手すぎ…

苦労したことは、これ以外にもたくさんあります。設定画面の作成や、PopUpButtonや、ComboBoxや…、
今回の開発で幾度となく失敗を繰り返し、周りの方々に迷惑をかけてしまいました。
この経験を忘れず、今後もアプリケーション開発をしていきたいです。

明日は　@mmmmmiyaさんです。
ではでは~~