元々やっていた、「サンプルコードのTaskyを自作する」から寄り道してしまっているので、本題に戻っていきます。
今日は、Taskモデルと管理しているManagerクラスを作ってダミーデータを表示するまでです。
using System;
namespace MyTasky.Core
{
public class MyTask
{
public MyTask ()
{
}
public int ID{get;set;}
public string Name{ get; set; }
public string Notes{get;set;}
public bool Done{ get; set; }
}
}
namespace MyTasky.Core
{
// ADOを使うのは後回し。
public static class MyTaskManager
{
private static IList<MyTask> tasks;
static MyTaskManager ()
{
tasks = new List<MyTask>();
}
public static IList<MyTask> getTasks(){
return tasks;
}
public static void saveTask(MyTask task){
tasks.Add (task);
}
}
}
サンプルコードはADOを使っているけど、まずはメンバ変数に持たせるだけにしました。 インタフェースを意識して書くのはJavaっぽいですね。C#の世界では関数名の頭は「大文字始まり」が作法のようですが、こればっかりはなんとも慣れず、小文字で書き始める事が多いです。
Objective-Cの世界の「先頭大文字は大体クラスの宣言、他は小文字始まり」に慣れてるから、なのですが。
namespace MyTasky.Screens
{
public partial class HomeViewController : DialogViewController
{
IList<MyTask> tasks;
public HomeViewController () : base (UITableViewStyle.Grouped, null)
{
this.Initialize ();
}
public void Initialize(){
// MyTaskManagerにダミーデータを投入
foreach (int i in Enumerable.Range(0,100)) {
MyTask task = new MyTask ();
task.ID = i;
task.Name = ""+i; // 文字列の+演算子を使って、数字を文字にいている。
MyTaskManager.saveTask (task);
}
}
public override void ViewWillAppear(bool animated ){
base.ViewWillAppear (animated);
this.PopulatedTable ();
}
private void PopulatedTable(){
this.tasks = MyTaskManager.getTasks ();
var rows = from t in this.tasks
select new StringElement (t.Name, t.Notes);
var s = new Section ();
// var s = new Section (){rows}; という書き方も出来たけどwarningが出た。
s.AddAll (rows);
this.Root = new RootElement ("MyTasky"){ s };
}
}
}
Listを使おうとしたらSystem.CollectionsやGenericをusingで宣言しておく必要があります。また対応するアセンブリがプロジェクトの「参照」に入っていなければ、これも追加する必要があります。この辺もJavaっぽいです。
文字列の扱いは、+演算子での連結が出来るので、とても楽に作れます。
また、"0〜10までの数字の列挙"は、Enumerable.Range(0,10)
で生成できます。
DialogViewControllerはUITableViewControllerを継承しているので、各タイミングで呼ばれるメソッド viewWillAppear等はそのままoverrideして書き換える事が出来ます。
大きく違うのは、表示するセクションやセルの情報を、Rootというメンバ変数に格納している点。なので、UITableViewControllerのように、"何行あるのか"とか"そのセルの高さは"とか"UITableViewCellのインスタンスを返す"とか、細かな処理(UITableViewDatasourceインタフェースのメソッドで提供していた事)をさっくり省略する事が出来るので、ソースがかなりすっきり出来るのが良いところです。設定画面やモック作成等では大活躍しそうです。
ただし、表示するデータの量(行数)が多いほど、この仕組みはパフォーマンスに影響が出てくると思います。なので、行数が増えたりUIを凝ったりしてパフォーマンスが悪化した時には、DialogViewControllerではなくUITableViewController等に書き換える時が来るかもしれません。