頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


macOSでバインドを使いテーブルを表示する

macOSでテーブルを表示させようとした。
NSTableViewDelegate、NSTableViewDataSourceを使わずにバインドを使う。
NSArrayControllerで検索するといろいろと参考ページが見つかると思う。

この方法は以前Objective-Cでやったことがあったのだが、今回はSwiftでやろうとしたらえらくはまってしまった。はまりすぎて、俺の理解がおかしいのか?とObjective-Cに戻ってまで確認したりもした。

YamaguchiTatsuya/NSTableViewWithBindings: Simple sample code for macOS, to show table view with bindings
↑とりあえず最小限のサンプルコードをGitHubで公開してみた。


NSArrayControllerをドラッグ&ドロップする

↑Interface builderでViewControllerにArrayControllerを追加(矢印のようにドラッグ&ドロップ)。

NSArrayController追加後の画面

↑ここに見えるので、これを選択して
1. outletを接続
2. Content ArrayをViewControllerのpropsArrayに設定

すると、ViewController内の以下のコードのように
        let tp1 = TableProps(name: "apple")
let tp2 = TableProps(name: "banana")
let tp3 = TableProps(name: "chocolate")

assert(arrayController != nil, "arrayController is nil")

arrayController?.addObject(tp1)
arrayController?.addObject(tp2)
arrayController?.addObject(tp3)

for tp in propsArray {
print(tp.name)
}

↑arrayControllerにデータを突っ込んだ直後にpropsArrayの中身を確認すると、ちゃんと表示されている!バインディングすげー!って感心しました。


テーブルで表示するには他にもテーブル周りでバインドを設定する必要がありますがサンプルコードでご確認ください。


なお、結局Objective-Cで動いたのにSwiftで動かず、
this class is not key value coding-compliant for the key name.
といったエラーばかり出てたのは、TablePropsクラスで@objc dynamic というのが必要だったためのようでした。

//var name: String = “” 実行時エラー
@objc dynamic var name: String = “”


Version
Swift 5.1.3
スポンサーサイト






独自ファイル形式のDocument Based Applicationのサンプルコード

macOSのDocument Based Applicationの公式サンプルコードの謎
↑この続き。

AppleのサンプルコードやXcodeのデフォルトのプロジェクトではファイルを.txtファイルとして保存・読み込みする。
実際にmacOSのdocument based applicationを作成する場合にStringオブジェクトだけ扱う、なんてことはなく、様々な型のデータを扱うことになる。
そういう場合のコードを作成し、サンプルコードをGitHubで公開してみた。

YamaguchiTatsuya/DocumentBasedAppWithOwnExtension: macOS sample code for document-based application for own extension

↑こちらで適当なところから git clone https… とかで見ることができるはず。

textの場合と異なるのはContextクラスをNSSecureCodingプロトコルに準拠するようにした、というくらいか。


macOSのDocument Based Applicationの公式サンプルコードの謎

macOSアプリの話です。iOSではありません。

XcodeでmacOSアプリのプロジェクト作成時の画面で、”Create Document-Based Application”のところにチェックするとそれ用のテンプレで新しいプロジェクトが作成される。
これをベースに自分が作りたいようにごにょごにょしていくものの、クラス間の参照関係だとかがイマイチよくわからない。実際作ってはみたものの、何だか動きがおかしい、、、
ということがあったので、再度調べてみたら、公式のサンプルコードがあることに気付いた。

Developing a Document-Based App | Apple Developer Documentation

↑これを動かしてみたんだが、、、確かに動く。でも、コードがなんか不思議だ。

ViewController内に下のようなコードがある。
    weak var document: Document? {
if let docRepresentedObject = representedObject as? Document {
return docRepresentedObject
}
return nil
}
Documentクラスのオブジェクトを得ているように見える。
ViewControllerのrepresentedObjectから参照を得ているけどそもそもDocumentクラス内でViewControllerのrepresentedObjectにはContentクラスのオブジェクトを入れてる。
それじゃあこのdocumentには値は入らないんじゃないのと思って調べるとやはりdocumentは常にnil、、、
document?.objectDidBeginEditing(self)
とかやってるけど意味ないのでは、、、?
何か見落としているのだろうか?んー、謎だ。


  TopPage  



Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.