【swift】TableView 【cocoa】


MacOS で TableView を使った小物のアプリを作ったのですが、思いのほか手間取ったので備忘録。

こちらのサイトのサンプル を参考にしたのですが、このままでは動かなかったので、手直ししたところだけ。

 func applicationDidFinishLaunching(aNotification: NSNotification) {
  // Insert code here to initialize your application
  myTableView.setDelegate(self)
  myTableView.setDataSource(self)
  myTableView.reloadData()  //一応
 }

明示的にデリゲートとデータソースを設定してやんなきゃダメみたい。
myTableView.Delegate = self 的な書き方を良く見かけたけど、ワタシの環境が古いからかエラーに。

 func tableView(tableView: NSTableView!, objectValueForTableColumn tableColumn: NSTableColumn!, row: Int) -> AnyObject!
 {
 // var string:String = "row " + String(row) + ", Col" + String(tableColumn.identifier) 
 // return string
  var newString = getDataArray().objectAtIndex(row).objectForKey(tableColumn.identifier) as? String //as? String を追加
  println(newString)
  return newString;
 }

こちらも as? String と明示的に指定してやらないとダメでした。

 func getDataArray () -> NSArray {
  var dataArray: [Dictionary] = [["FirstName": "Debasis", "LastName": "Das"],
    ["FirstName": "Nishant", "LastName": "Singh"],
    ["FirstName": "John", "LastName": "Doe"],
    ["FirstName": "Jane", "LastName": "Doe"],
    ["FirstName": "Mary", "LastName": "Jane"]];

  println(dataArray);
  return dataArray as NSArray;  // as NSArray を追加
 }

こちらも戻り値を NSArray に明示的にキャストしないとエラーに。

他に注意点としては、IB で TableView を cell based にしてやることと、column の ID を dataArray の key と同じ にしてやることですかね。

一画面しか使わない小物アプリだと、わざわざ viewController を追加するのも面倒なので、まぁ、こんな感じで良いかと。

しかし、なんで自分で拡張しなくちゃならんのか。
柔軟性重視なのかな。
指定のフォーマットで Dictionary なり Array を作って、引数として渡せば、表示してくれる物かと思ったなり。

スポンサーサイト

コメント

非公開コメント