動的にNSTableColumnを追加してBinding

動的に、カラムを追加して、そこにBindingを利用した値を表示させたいんだけど、一筋縄ではいかないらしい。

  • 該当するビューの配下のFieldを取得する
  • Fieldとビューをバインドする

なる手順が必要らしい。

IB上の”Table Cell View”は、該当Columnのビューに相当するらしく、そこからは、ObjectValueというキーを経由して参照できるらしい。

とりあえず、以下のように書いたらバインドできたんだけど、最初の1つのみ。

[objc]
let tableColumn = self.transactionListView.tableColumns[columnIndex]
if let account = MCAccount.namedAccount(db, name: tableColumn.identifier.rawValue) {
let newView = self.transactionListView.view(atColumn: self.transactionListView.tableColumns.count – 1, row: 0, makeIfNecessary: true)
let textField = newView!.subviews[0]
let keyPath = String.init(format: “objectValue.%@”, arguments: [account.name])
textField.bind(.value, to: newView, withKeyPath: keyPath)
[objc]

むりやりセルをバインドしてるんだけど、おそらく、マスター(?)みたいなものに対してBindしないといけないんじゃないかと思う。(けど、どこにも書いてない・・・・)

結局、func tableView(NSTableView, viewFor: NSTableColumn?, row: Int) のドキュメントをよく読むと書いてありました。
けど、気づかないよねこの説明。

CocoaBinding

以前は、objectControllerからダイレクトにセルにBindしていたと思うけど、今流は、
ColumnにObjectをバインドして、その後、CellにColumnにバインドしたオブジェクトのプロパティを指定して設定という流れらしい。

というか、そうでないと、ibtooldが返ってこない。

ViewBase TableView と CoreData と CocoaBinding

まず、Document/managedObjectContextの渡し方でハマりました。

View経由で渡そうとしても立ち上げ時には、まだViewはできてなくて、はまりまくり。

結局、このページを参考に、representedObject経由で渡せるようになりました。

うまくいったと思ったら、そのあとにまた一波乱・・・・

CocoaBindingでNSTableColumnにBindしたんだけど、Cellに値が表示されない・・・・

いろいろ右往左往して試行錯誤した結果、以下の2段階のBindingが必要とわかった。

1)まずは、ArrayControllerのarrangedObjectをNSTableColumnにBind(この時に、ModelKeyPathは、空欄で良し)
2)次に、NSTableCellViewの中の表示要素(Defaultでは、NSTextField)にTable Cell ViewをBindし 、ModelKeyPathは、表示すべき要素(必要ならば、ValueTransformerを使う必要あり)

どうして、このように2段階になっているかというと、ざっくりいうと「ViewBase」だから。
もう少し細かく言うと、View Baseになったので、その(従来のCell相当の)View/NSTableCellViewには、なんらかの表示対象要素そのものがBindされるべきで、そこから、表示要素(NSTableCellView)の各要素について、表示対象要素のうちのどこを表示させるかをBindする。

というような理屈だと思う。 Continue reading

ViewBase TableView使い方の覚書

最近、Cell Baseは、ほぼほぼObsoleteでViewBaseを使うべきと気づいた

ので、View BaseのTableViewの使い方メモ(とくにセルはカスタマイズしないケース)

表示編

  • NSTableViewを配置したりは、いつも通り
  • NSTableColumnにidentifierを設定する(どのカラムかの判断に必要)
  • NSTableViewCellにもidentifierを設定する(表示用のセルをインスタンス化するのに必要)
  • NSTableViewのdelegateに、 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? を実装
  • 実装関数のなかで、cellView.textField等に設定

編集編

  • TextField等にdelegateを設定
  • delegateに、override func controlTextDidEndEditing(_ obj: Notification) を実装
  • obj.objectが編集に使用されたField、field直下のcellのrepresentedObjectに編集対象を入れておくと、探し直す必要なくて便利
  • 対象オブジェクトと変更すべき項目がわかるはずなので、あとは、自明

ExifClipアップデート/アプリのアイコンの作り方

ボタンの不具合を見つけて、修正しました。

ついでに、スプラッシュスクリーンもアップデートしようとしたんだけど、オリジナルデータが、iDrawフォーマットって・・・

この際だから、ゼロから作り直すことを目指して、アイコンの作り方メモ

# ちなみに、iDrawはAutoDeskに買収されて、Graphicsなるアプリに切り替わってました。そのアプリでiDrawフォーマットが読めて解決

# でも、アプリのアイコンの作り方忘れているので改めてメモ

Continue reading

ちょっと小さめの確認ビュー

ちょっと小さめの確認ビューを作りたくて、ここ数週間悩んでました。

Googleでの検索キーワードの使い方が上手じゃないんだと思うんだけど、やっとわかった。

ここ

自分のやりたいことは、
[objc]
UIViewController *vcModal = [[UIViewController alloc] init];
[vcModal setModalPresentationStyle:UIModalPresentationFormSheet];
[self presentViewController: viewController animated:YES completion: nil];
[/objc]
でできました。

UIPresentationController

iOS上で、モーダルな選択ダイアログを探して、見つけたのが、 UIPresentationController。

以下のステップで実装するらしい(参考リンク)

  • ViewControllerにProtocol <UIViewControllerTransitioningDelegate>を追加
  • プロトコル中の以下のメソッドを実装。
    [objc]
    – (UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source;
    [/objc]
  • 実装の中身は、こんな感じ
    [objc]
    -(UIPresentationController*) presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source {
    return [[ alloc] initWithPresentedViewController:presented presentingViewController:presenting];
    }[/objc]
  • 呼び出したいタイミングに以下のようなコードを実装
    [objc]
    <CustomViewController>* customViewController = [storyboard instantiateViewControllerWithIdentifier:@”ID”];
    albumSelectTableViewController.modalPresentationStyle = UIModalPresentationFormSheet;
    [self presentViewController:customViewController animated:YES completion:^{
    return;
    }];
    [/objc]

とすることで、モーダルなダイアログ表示までは、完成