とある子育てエンジニアの1日

子育てエンジニア Advent Calendar 2018 6日目の記事です。
(当日に投稿が間に合いませんでした…ごめんなさい)

adventar.org

今年の夏頃だったでしょうか、女性エンジニアのロールモデルがいないという話題がありました。

私もロールモデルを探しているのですけれど、なかなか難しいですね。

女性エンジニアに出会いたい…けれど子育てしているとイベントに参加することもままならないので、リアル出会いがとても少ない。

性別女性で、崖っぷちですがエンジニア職をしながら子育てしているので、ロールモデルの話には当てはまりませんが、今の私がどのような1日を送っているのかを書いてみたいと思います。

ご参考まで…(ならなそう)

どんな人

  • 30代半ば
  • エンジニア歴10年(約1年間の産育休*2=2年間を含む)
  • 最近Unity多めのアプリプログラマ
  • 5歳児と1歳児のお母さん
  • 時短勤務 (6h)

1日の行動

時短適用で 6h/日 勤務です。

出社すると通勤で作業時間が減るので、在宅時に長めに作業して週30時間を満たすように調整させてもらっています。ありがたいです。

時間 行動
05:00-06:00 子1or2に起こされ起床
06:30-07:00 朝食準備、保育園準備
07:00-07:30 朝食(子1&2に食べさせる+自分の食事)
07:30-07:45 片付け、子1&2の身支度
07:45-07:55 自分の身支度
08:00 出発
08:30 登園
16:30 降園
16:50-17:15 パターン1) 公園で遊ぶ
16:50-17:45 パターン2) 公園 + 買い物
17:30-18:00 帰宅
18:30-19:00 夕食(子1&2に食べさせる+自分の食事)
19:00-19:30 片付け、ちょっと休憩
19:30-20:30 風呂、子1&2着替え、洗濯ボタン押す
21:00-21:30 子2授乳→就寝、洗濯物の一部を干す、乾燥ボタン押す
21:30-22:00 子1と本読む→就寝
22:15-23:15 仕事or趣味時間
23:30 就寝
24:00 子2授乳
27:00 子2授乳
  • 休日もほぼ同じ
    • 仕事時間→子1&2の遊び時間に置換
    • 夫と交代で、1~2h/日、ひとりになる時間を作っています

所感

  • 世の中にはもっと過密なスケジュールをこなすスーパーお母さんもいらっしゃると思うのですが、私は現状で限界ぎりぎりです。。

  • 睡眠時間が細切れなのが最もつらい!もともとは8時間しっかり寝てしまう人だったのに〜…

  • 夜に仕事を残してしまいがち。寝かし付けの際に自分が寝落ちないように必死。

  • 数年先のことよりも、今、一日を生きることに、強烈に焦点を置くようになりました。

    • 子どもがあっという間に成長していくからなのでしょうか。一日一日がとても尊いものに思えてきた。
  • 子育て/医療/教育/行政…といった情報のインプット量が圧倒的に多くなりました。

    • 子育てスキル(?)の成長は著しいです。
    • (昔からのあらゆる知り合いに「あのtakopomちゃんがお母さんになるなんて!!」と言われるレベルからのスタート…)
    • この歳になってもゼロから成長できることに出会えて、伸びしろまだいっぱいあった私!と嬉しくなったりもしました。
  • この先エンジニアを続けられるのだろうかという不安は年々増しています。

    • 技術情報のインプット/アウトプット量の減少
    • 第二子、頻回に病気する問題発生中
      • 夫婦二人で回りきらない…
      • 病児保育やベビーシッターの充実している地域へ引っ越すのか
      • または祖父母を頼るために実家近くに引っ越すのか
    • パートナーとあらゆる問題についての相談…進んでない…
    • この生活スタイルになってから、「趣味=プログラミング」でないとエンジニア職を続けられないのではないか??と感じている

正直に言いますと、もうIT系エンジニア続けられないかもしれない…と挫折の局面に差し掛かっている気がするのですが、プログラミング楽しい!と思っている自分がまだいるので、もう少し奮闘してみるつもりです。

ですが、自分で「ぎりぎり」と感じる生活スタイルではなく、もう少しだけ心にゆとりのある生活の上で、エンジニア職を続けられるといいなと思っています。(希望)

というのも、私の心にゆとりがない→イライラしやすくなる→影響が子供たちに及ぶ…という負の連鎖を回避したいからです。

そのためにはパートナーと一緒に、お互いの理解と協力を、より深めていくことが大切だと感じています。(そしてとてもむずかしい)

来年もエンジニアでいられますように…!!!

iOSDC2018に行ってきました

ひと月以上過ぎてしまいましたが参加した記録を投稿です。

iosdc.jp

文章にしたらものすごく長文になってしまったので、要点箇条書きスタイルでいきます。

ルーキーズLT枠で参加

LT内容

AVAudioEffect実演 〜もっと音を楽しもう〜 というタイトルでLTさせてもらいました。

speakerdeck.com

  • [WIP] エフェクトが掛かった音声を、スライドに埋め込みたい
    • 音は録音済みなので、あとはYouTubeに上げれば…という所で手が止まってます…

LT当日の感想

  • iOSDC初参加、人生初登壇ということでルーキー枠に応募
    • キャリア的には全然ルーキーじゃないけどOKだった
  • 練習不足すぎて5分をオーバー
    • 悔し過ぎました
  • ルーキーズのLTはプロ感満載で、「ルーキーとは???」と思った
    • 皆さん謙遜が過ぎる…!

LT応募の理由

  • いつか登壇というものをしてみたいと思っていた
  • iOSのオーディオについては、わりと深い所まで掘った(と思う)ので、いつかどこかで出力したいと思っていた
  • 子育ての事情や、自分自身の心持ちの問題で、ようやく動ける気持ちになったので勢いで応募した
  • 実演をメインにして、スライドは背景画像、みたいな発表をしてみたかった

LT練習会

  • 家庭の都合により、昼までの参加となった
  • 1回練習させてもらった
  • フィードバックがめちゃくちゃ参考になった
  • それなのに本番で5分を超えてしまって…心からの悔しみ
  • 練習会を開いてくださるなんて、iOSDCという場の温かさを感じた

iOSDCに参加してみて

  • iOSを久しぶりに吸収した
    • やっぱり楽しいなと、改めて実感
  • (LTでも)スピーカーになると、所属が+1されたような気分
    • iOSDCという所属が増えた気持ちになった(勝手に)
    • 普段は「家庭」「会社」「保育園」の3枠が主なので…
    • 所属が増えるのはいいことですね
  • おみやげいっぱい!
    • 衣類でリュックサックがはちきれそうになったw
    • パーカーが薄手でめちゃ重宝
  • 金・土の2日間、それぞれ半日ずつの参加となった
    • 木:不参加
    • 金:保育園のお迎え時間まで(15時には退散)
    • 土:昼過ぎ〜LT最後まで
    • 日:家庭の都合で不参加
  • 未就園児*2を育てていると、土日終日の参加はハードル高いと感じた(我が家の場合)
  • もし託児があったら、朝一〜夕方くらいまで、たっぷり楽しめるのかな…と夢のようなことを思った
  • LT準備と家庭の両立がめちゃくちゃ大変だったので、来年は一般参加したいと思った
    • という旨を社内LTしたら「それはtakopomさん家、固有の問題なのでは…」というフィードバックをいただいた………!!!
    • パートナーの理解と協力は、本当に大切><
  • 子がもう少し大きくなったら運営側も経験してみたいです
  • LTについてはいつか成功体験をして悔しい気持ちを塗り替えたい

Women Techmakers Tokyo 2018に行ってきた

先日Women Techmakers Tokyo 2018に参加してきた時のメモを晒します。とても良いイベントでした!

gdg-tokyo.connpass.com

参加者

職種

男女比

  • 1:9くらい(個人の主観です)

Keynote

www.slideshare.net

Service WorkersとKinukoさん

  • 初期メンバーではない
  • 出産のために半年休んで、復帰
  • ローンチ時のコア部分を設計した

大きなプロジェクトを掴むために心がけたこと

  • 偉い人、普段話さない人と話した
  • 組織全体の優先度と、自分の出来る事を、見直した
  • 良いチャンスを掴める準備が整っていた
  • Comfort Zoneにいると感じたら、次の展開を探す

チャンスを掴むためには

  • 組織の動き、業界の動きに、アンテナを張る
  • 実際に組織を動かしている人たちと、話す
  • 地味な努力が大切
  • 自分のポートフォリオを定期的に見直す

技術者がキャリアを築くために出来る事

  • ゴール(キャリアを築く、大きな事を成し遂げる)を設定
  • そのために、自分が成長させておくべき事
  • 自分が得意な事

ゴールに辿り着いた理想状態から、どうしていくかを考える。

技術力、発想力、コミュニケーション力などは、ゴールへの「手段」。 こればかり磨いていても、ゴールはやってこない…かもしれない。

本当に大事なことは

  1. Impact
  2. Difficulty
  3. Leadership
  4. Happiness

Impact

プロジェクト内における、個人の影響力

  • どれだけチームに貢献したか
  • もし自分がいなかったら、プロジェクトのどこが成功しなかったか

組織における、プロジェクト自体の影響力

  • そのプロジェクトは、ユーザ、組織、業界に、どれだけの貢献があったか
  • 利益、ユーザ数、人々の幸せ、分野の進展に、どれくらい影響したか

Difficulty

どれくらい困難な問題を解いたか、解けることを示したか

「困難なこと」

  • 技術的な困難(…に直結しやすいけれど、それのみではなくて)
  • 業界における困難度
  • 組織的な困難
  • 対外交渉の困難
  • 問題自体を定義することの困

Leadership

他人に影響を与え、組織をリードすることで、より大きいImpactを産む!

  • そのために、マネージャやリーダーである(になる)必要はなくて
  • 自分の考えを、どれだけ相手に感染させるか
  • Self-Leadership
  • チーム、複数のチーム、組織、業界…と、スコープが広がる

アンチパターン

  • 自分ができることの延長線上に、問題を作りがち
  • 組織の優先度や技術的に可能なことと、ゴールが乖離する
  • 難しい方法で解くことに専念するが、Impactに関係ない、または、悪影響を与える。
  • Howばかりに注力する → 後のメンテナンスに苦労する → (しかもユーザには直接関係ない)
  • キャリアにだけ焦点が当たっていると、Impactがはっきりしていることだけをやりたがる → 信頼を得にくくなる
  • 他人のアイディアをサポートしない → 組織、チームとしてのImpactとHappinessが損なわれる
  • 他人のプロジェクトの助け役に徹してしまう → 自分の得意なことばかりになりがちで、成長機会も少なくなる

Happiness

自分が情熱を持って、Happyにできるものをやるのが一番! それがマッチしないと感じたら、組織やチームを移るのも、一つの手。

  • 自分や、チームの人が、「どこで幸せを感じるのか知る」ことは大事!

つらい時

辛い時、全力を出せない時、やりきれない時… 心がうまくついて来ない時は

  • 「心」とは「コントロールできないもの」と割り切る
  • でも「状況」「環境」「技術」はコントロールできる
  • 自分の心が安心しやすい(らしい)やり方を覚える

  • 瞑想
  • 運動
  • 空き時間の使い方
  • ToDoの作り方

自分の成長とキャリア

自分のポートフォリオを常に見つめ直す

  • より大きいゴールを達成するため
  • どこを伸ばさなければならないか
  • Impactに直結しないとしても、伸ばしておきたい所は、時間の割き方などを調整しつつ、投資する

他人に影響を与えられる立場に立つ

  • 存在感を出す(Impactのある仕事を通じて)
  • 人から信頼されるようになる(技術力などの成長を通じて)
  • 柔軟さを保つ(判断を下すこと、根拠を元にはっきりと述べること)
  • 相手の意見に敬意を払う(先輩後輩や役職などの、立場に関係なく)

「自分」から「チーム」へ

自分に焦点が当たりがちだけど、チームへ焦点を当てる。

  • 人間性を大切にする
  • フィードバックを伝える
  • Team Happiness

フィードバックの伝え方

  • 早く(後になってから言って「もっと早く言ってよ」となるのはお互いに辛い事)
  • 率直に
  • 簡潔に

Team Happiness

チームのHappinessが、生産性に最も影響を与える!

Meetingのやり方

(人数が多いMTGの場合)

  • 始めに、全員に関係のある事を話す
  • その後、細かい議論は関係者とやる
  • プレゼンはしない(プレゼン資料を用意しない)
  • ドキュメントが必要な時は、事前に作ってシェアしておく
  • 議事録は、全員で共有文書にとる(Google Docsとか)。その場で書き終わったら終わりにする。
  • プロジェクト全体の優先度、ロードマップなどのような大きいものは、あらかじめ文書にする。MTGで皆で編集する。

トークセッション

興味深かったことのメモです。

女性エンジニアとしての強みとは?

  • 顧客が女性向け業界の場合、男性より女性の方が間に入りやすい(例:化粧品、下着など)
  • flamingoは女性ユーザが多いサービスなので、開発者自身が「かわいい」と思えるものを提供できるのが良いところ
  • 男性だけではなく、色んな人がいた方が「サービスが良くなる」と思っている(←同意!!)

CTO像

様々ある中の一例として

  • 「経営陣の中で一番技術がわかっている人」
  • 技術に最も長けている事ではなく、経営をきちんとわかっている事を重視した

ロールモデル

  • 憧れの人と、現在の自分との、中間地点をうまく見つける
  • 技術者or管理者…どちらか一つに特化するよりも、両方をバランスよくやりたい、という方が多かった印象

ワークショップ

www.slideshare.net

Android Things

  • NXP i.MX7Dを使いました
  • コードラボの手順に従って、もくもく
  • Lチカ面白すぎて時間費やしすぎた
  • TensorFlowやってみたかったー

所感

  • 女性エンジニアがいっぱいいた!!
  • 「Happinessが一番大事!」…深く深く噛みしめた!

やろう

  • 懇親会でのコミュ力を上げよう(現在Lv.1/10)
  • 自分のポートフォリオを見つめ直そう
  • Team Geek 読もう(→now reading)
  • ToDoの粒度は試行錯誤しよう (私には細かい方が良さそう)
  • 個人の、チームの、Happyを目指そう

IFTTT, Google Assistant, Google Sheetsで赤ちゃんの授乳を記録する

Geek Women Japanアドベントカレンダーの9日目です。

qiita.com

ただいま、今夏に生まれた第2子の育休中です。そして気が付きました。授乳中は身動きがほとんど取れない…!何なら視線さえも縛られる…しかし口だけは自由だ!と。

お手軽なIFTTTを使って、Google Assistant + Google Sheetsで赤ちゃんの授乳記録を作ることにしました。

準備

アカウント

  • IFTTTアカウント
  • Googleアカウント

これらは、既に用意されているものとします。

また、IFTTTにGoogleアカウントを連携しておきます。

Google Assistant

iOSの「Google アシスタント」アプリを使って動作を試しました。 アプリにも、IFTTTに連携したGoogleアカウントを設定しておきます。

Google Homeで動作させてみたかったのですが、今日までに届きませんでした!残念!)

記録するもの

毎日の赤ちゃんの授乳状況を記録するものとします。

そして一口に「授乳」と言っても、実際の手法は様々なのですが、、今回は「ミルクの授乳」について取り扱います。

IFTTT

f:id:takopomm:20171209010538p:plain

アプレットを作成してみます。

何をするか

アシスタントからの入力で、

  • いつ
  • ミルクを
  • どのくらい飲んだか

スプレッドシートに記録します。

例えば、「ミルクを140」と言ったら、「現在日時にミルクを140ml飲んだ」ことを記録するようにします。

This

Google Assistant」を選びます。

f:id:takopomm:20171209010426p:plain

Choose trigger

数値を1つ含むので、「Say a phrase with a number」を選択します。

f:id:takopomm:20171209010810p:plain

Complete trigger fields

例えば「ミルク100」と言ったら動作して欲しいので、このようにしました。

f:id:takopomm:20171209011215p:plain

#で数値が取得できます。#の前(後)には空白が必要です。

アシスタントからの返答には、お母さんへのねぎらいの言葉を付け加えておきます。(もしミルクをお父さんがあげている場合は、お父さんへ!)

f:id:takopomm:20171209011515p:plain

言語は「日本語」を選択して「Create trigger」すれば、Assistantの動作の出来上がりです。

That

スプレッドシートに記録したいので、「Google Sheets」を選びます。

f:id:takopomm:20171209012010p:plain

Choose trigger

行を追加したいので、「Add row」を選びます。

f:id:takopomm:20171209012347p:plain

Complete action fields

記録先のスプレッドシートの指定と、セルに書き込む内容を指定します。

f:id:takopomm:20171209012516p:plain

自分のGoogle Driveスプレッドシートを作成しておきます。 私の場合は、

というものを用意したので、上の画像のような設定になっています。

セルに書き込む内容の指定で、「日時」はCreatedAtパラメータを利用したいところですが、現状動作していないそうです。 そのため、スプレッドシート側にスクリプトを埋め込んで、日時を記録できるようにします。

Spreadsheet

日時を記録するために、スプレッドシートスクリプトを追加します。

f:id:takopomm:20171209013552p:plain

function

セル(最後の行, 指定の桁)に、現在日時を書き込みます。

function addDate(e) {
  var row = SpreadsheetApp.getActiveSheet().getLastRow();
  SpreadsheetApp.getActiveSheet().getRange(row, 1).setValue(new Date());
}

トリガー

「シートに値の変更があった時」に、上のfunctionが実行されるようにします。

f:id:takopomm:20171209013644p:plain

参考

動作確認

Assistantアプリで、「ミルク120」と言ってみます。

「ミルクを120ミリリットルですね。お疲れ様です!」と返してくれました。

f:id:takopomm:20171209014329p:plain

スプレッドシートにはこのように記録されました。

f:id:takopomm:20171209014531p:plain

実際には、ミルクだけでなく母乳の場合も記録できるように、IFTTTにいくつか追加しました。 phraseが多少異なるだけで、やることは同様です。 すごくお手軽に、なかなか実用的なものが出来る…!!!

感想

  • 個人的には手書きの日記も好きなので、スプレッドシート上に完全移行するかどうかは決めかねていますが、身動きが取りづらい状況でも記録できるのはとても便利。

  • 1日に何分授乳したか、1ヶ月に何時間授乳したか…といった情報を返してくれるようにもしたい。 手書きの育児日記からは読み取りにくいデータを、お手軽に知れたら面白そう。

  • DialogFlowも使ってみよう。

  • 授乳を頑張るお母さんの心もアシストできるといいな!

Geek Woman Japan ミニカンファに子どもと一緒に行ってきました

2017/03/04に開催されたGeek Women x Microsoft - Geek になりたい人のためのミニカンファに行ってきました。

geekwomenjapan.github.io

(毎度イベント行ってきたレポが数ヶ月後になってます…ぬぬぬぬ)

今回も子どもと一緒に行ってきました

託児サービスを用意してくださっているということで、今回もありがたく利用させていただきました。 無料で託児を利用できるのは、本当にありがたいことです。感謝、感謝です!

託児を利用してみて

前回のカンファレンスで託児をお願いしたことで、私の中で何かの壁を一枚突破したようで、以前ほどの葛藤も少なく申し込みすることができました。 それはきっと、前回の経験を通じて「お母さんでもカンファレンスや勉強会に参加してもいいんだ!」と、自分の中に薄っすらとある罪悪感のようなものが吹っ切れて、気持ちが前向きに定まったからかもしれません。

今回は午後からの開催ということもあり(?、たまたまかもしれませんが)、託児の開始時刻から数人のお友達と一緒に過ごすことができて、子どもも楽しかったようでした。 我が子も3歳半になり「誰かと一緒に遊ぶことが楽しいと感じる時期」に入ったこともあるかもしれません。

託児のスタッフさんはとても温かく迎え入れてくださって、(母に似て)人見知りな我が子でも、とてもリラックスできた様子でした。(昼寝までしっかり済ませたそうで…びっくり!)

セッションの感想

今回は(前回と比べると)技術系のセッションが多く、ジャンルも様々で面白かったです。 未知の内容ばかりで、もっと技術を学んで行こう!とテンションが上がり、とても良い刺激を受けました。

その中でもやはり、女性が業界でどう働いて行くかという話は興味深く、「GeekなWomenならではのセッション」という感じがあります。 個人的にはこういったセッションを、今後もまた聞けるといいなと思っています。

Markdown形式でメモしたものをGitHub上に置いています。 4セッション聴いたうちの2つ分です。

※自分用メモなので間違いもあると思いますがご了承ください…!

github.com

懇親会

本当は参加したかったのですが、子どもも「おなかすいた〜早く帰ろう〜」という感じだったので、わいわい賑わう懇親会会場を横目に、そそくさと退散してきました…!

カンファレンスは、懇親会などに出て交流を持つことも大事なミッション(?)のひとつだと思うようになったので、それが達成できなかったのは残念です。。

それと、「こういう場に子どもを連れてはいけないのでは…」と思い込んでいる節もありました。 実際のところはどうだったのでしょう…?? もし幼児が一緒に居ても大丈夫だったら、わずかな時間でも顔を出してみても良かったなと思いました。

まとめ

やはり、カンファレンスや勉強会に参加すると刺激になってとても良いです。 普段はエンジニア女性が一人という環境で仕事をしているので、世の中にはこれだけたくさんの女性エンジニアが活躍していらっしゃる!と実際に体感するだけでも、自分の世界が広がるように感じます。

カンファレンスの楽しみを知れたばかりなのですが、今夏第二子出産になるので、しばらくイベント等には参加できなくなりそうです。うーむ…もっと行きたい!

またいつの日か、「託児あり+土日祝+日中開催」という素敵な条件のイベントがあれば、第二子は夫にお任せしてまた子どもと一緒に参加したいなとこっそり考えています。

NSTableViewの行ドラッグ&ドロップをやってみた

今回はNSTableView内の行をドラッグで移動させてみます。

やること

  1. ドラッグ元の行番号をPasteboardに保存する。
  2. ドロップされた時に、そのドロップを受け入れるかチェック。
  3. ドロップを受け入れたら、Pasteboardに保存していたドラッグ元の行番号を取り出して、ドロップ先と入れ替えるなど。

3では用途に応じて、移動元の行と移動先の行に対して自由に操作を行います。
今回は、移動元と移動先を「入れ替える」挙動にしてみました。

実装

NSTableViewDataSourceの以下3つを実装します。

1. ドラッグ元の行番号をPasteboardに保存する

func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool {
    // Pasteboardにドラッグ元の行情報を記録
    let data = NSKeyedArchiver.archivedData(withRootObject: rowIndexes)
    let item = NSPasteboardItem.init()
    item.setData(data, forType: draggingUTIType)
    pboard.writeObjects([item])
    return true
}

ペーストボードを使う所が少々トリッキーだなと感じました。

2. ドロップされた時に、そのドロップを受け入れるかチェック

func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableViewDropOperation) -> NSDragOperation {
    // 今回は、同じTableViewからのDropのみを受け付ける
    guard let source = info.draggingSource() as? NSTableView, source === tableView else {
        return []
    }    
    return .move
}

例えば、別のウィンドウからファイルをドロップするような場合もここに入ります。 ファイルのドロップを受け入れたい時、または受け入れたくない時は、ここで許可や拒否をします。

  • .moveを返す:ドロップを受け入れる
  • []を返す:ドロップを受け入れない

NSDragOperation

今回は「移動」させたいのでNSDragOperation.moveを返しています。 NSDragOperationには、他にも.copyなどの操作があるので、移動以外にも使えるようです。(試していません)

3. ドロップを受け入れた後の処理

func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableViewDropOperation) -> Bool {
    // ドラッグされたアイテムのUTI typeを確認
    guard let item = info.draggingPasteboard().pasteboardItems?.first?.data(forType: draggingUTIType) else {
        return false
    }
    // Pasteboardに記録しておいたドラッグ元の行Noを取り出し
    guard let sourceRowIndexes = NSKeyedUnarchiver.unarchiveObject(with: item) as? IndexSet, let from = sourceRowIndexes.first else {
        return false
    }

    // ... 入れ替えの処理など ...
    
    return true
}
  • ドラッグされたアイテムのUTIを確認して整合性チェック
  • Pasteboardに記録していたドラッグ元の行番号を取り出し

などしています。

ここではドロップ先の行番号が取得できるので、移動元と移動先の行番号を使ってデータの入れ替えなどを実装できます。

UTI

今回初めてUniform Type Identifiersの事を知りました。

サンプルではpublic.dataを指定しました。(誤っているかもしれません)

サンプル

以前にNSTableViewを試したサンプルに、ドラッグで行を入れ替えるコードを追加しました。

github.com

以上です!

NSTableViewをCocoa Bindingsで使ってみた

TableViewにデータを表示するためにCocoa Bindingsを初めて使ってみたので手順をメモしておきます。

環境

はじめに

ViewControllerにTableViewを設置しておきます。

f:id:takopomm:20170405151155p:plain

こんな感じです。

1. Array Controllerを設置

f:id:takopomm:20170405151356p:plain

Array ControllerをSceneの中に追加します。

f:id:takopomm:20170405151403p:plain

@IBOutletでViewControllerに接続しておきます。

class ViewController: NSViewController {
    @IBOutlet var arrayController: NSArrayController!

2. モデルを書く

TableViewに表示したいパラメータを持つモデルを定義します。

例えば、「No」「名前」「年齢」などなど…自由に。

3. Array Controllerにコンテンツを追加

先ほどIBOutletで接続したArray Controllerに、TableViewに表示したいパラメータを持つモデルデータを追加します。

arrayController.content = [もでる1, もでる2, もでる3, ...]

という感じです。

4. Storyboardの設定

4.1 Array Controller

Array Controllerを選択した状態で、Attributesの設定項目Object Controllerを編集します。

f:id:takopomm:20170405151707p:plain

  • Class Name: 先ほど定義したモデルのクラス名
  • Keys: モデルのパラメータ名を+から追加

f:id:takopomm:20170405151717p:plain

このような感じにしておきます。

4.2 Table View

Table Viewを選択した状態で、Bindingの設定項目Table Content - Content を編集します。

f:id:takopomm:20170405152031p:plain

  • Bind to Array Controller: チェックをONにする
  • Controller Key: arraygedObjectsのままにしておく

4.3 Table View Cell

Table View Cellを選択した状態で

f:id:takopomm:20170405152516p:plain

Bindingの設定項目Valueを編集します。

f:id:takopomm:20170405152523p:plain

  • Bind to Table Cell View: チェックをONにする
  • Controller Key:空欄のまま
  • Model Key Path:objectValue.xxx

Model Key Pathxxxの部分には、自分で定義したモデルの、表示したいパラメータ名を指定します。 上記の例ではnumberというパラメータを指定しています。

パラメータ名だけを指定してもダメなようです。objectValueが必要でした。

すべてのTable View Cellに設定する

TableViewのカラムが複数ある場合は、すべてのTable View Cellに対して、4.3のようにモデルのパラメータ名を指定しておきます。

以上で準備完了です。

5. 実行

f:id:takopomm:20170405152838p:plain

表示できました!

TableViewDataSourceを指定しなくても、データを表示できる所がいいですね。

ハマったところ

Table View CellModel Key Pathに何を設定したらよいか分からず色々と試していたら、Storyboardのビルドが一向に進まず、しかしエラー内容は特に表示されず、、という状況になってしまい困りました。。

サンプル

上記の実装だけですが、GitHubに置きました。

github.com