Objective-C 諸々

objective-c や cocoa の割と独自仕様っぽいところ。

delegate

見かける割にいまいち理解できていなかったデリゲート。

「MTKView のデリゲートがレンダラー」と気がつき、ああそういうことかと納得。

大抵の場合、ViewController が MTKView を呼び出す前に

_view.delegate = _renderer;

などとしているはずだ。

メタルの表示用ビューとして MTKView は存在しているが、各アプリでのこのビューの使い方は様々だろうから、そこら辺は自分で DrawInMTKView を実装してね、プロトコルは準備しておくから・・・ということなんだと思う。

わかりにくくなるのは、プロトコルが明示されているわけではないので、その仕組みに気が付きにくいからじゃないでしょうか。

本来であれば以下のような記述が必要なようだ。

委譲する側(のヘッダ)

@protocol HogeDelegate

@property (weak, nonatomic) id delegate;

@protpcol HogeDelegate <NSObject>
-(void)FugaMethod;
@end

以下のように明示的にぶん投げるときもある。

委譲する側(の .m ファイル)

[self.delegate FugaMethod] //こうやって使うようだ

ぶん投げられる側はプロトコル準拠を明示しておく。

委譲される側(のヘッダ)

@interface Fuga: NSObject <HogeDelegate>

ところで、これが面白いのは、ある種の情報の通知として利用できる点。
上の例なら、Hoge の情報を Fuga で受けられる。
ViewerController に受け持たせてしまい、あるオブジェクトでの情報をビューに反映させるといった使い方ができる。

参考:https://dev.classmethod.jp/articles/ios-delegate/

マルチスレッド処理

NSTread を使う方法、dispatch_async – queue の系を使う方法などいくつかあるようだ。

(続く)

KVO

https://qiita.com/mitsu9/items/e738c41a8d87cc71ec3e

KVOとはキー値監視(Key-Value Observing)のことを指します。
アプリ開発をかじったことのある人ならMVCという言葉を聞いたことがあると思いますが、KVOはModelの変更をControllerやViewに通知し、反映させるための仕組みです。
他の通知システムとしてはdelegateやNSNotificationを利用した方法などがあります。

なるほど。

サンプルとして MCV を意識したメモアプリあり。

インスタンス変数の宣言

Objective-Cでは、インスタンス変数をどこに宣言するのが正しいのか? 』が興味深かった。

やはり、みなさん疑問に思っていたんですね。

参考

phorlix100 の github issues
いやー、大変参考になりました!

C での配列の取り扱い

C での配列の取り扱い

C で配列使う時は注意が必要!

と、このブログでも以前に書いたが、やってもうた…

まあ、実際には未遂だったんだが。

 

しかし、エグいのは構造体のメンバーに vector_float3 を代入するような場合で、こう書かないとエラーが出る。

structObj[0].position=(vector_float3){0.5, -0.5, -0.5};

単に {0.5, -0.5, -0.5} と書いたのではダメのようだ。

配列の要素が数個なら後で代入してもそれほど手間ではないが、10 以上になったら宣言と同時に初期化しておかないと実用的ではないように思う。

また、構造体をグローバルで使いたい場合は、諦めた方が賢明かもしれない。

メソッドの中で static const で定義し、ポインタ使ってメソッド間で受け渡すしかないような気がする。

Metal で複数のオブジェクトを描画する

見出しのことをやろうとすると難しくないか?

というのが最近の問題意識。

二つのポリゴンというような意味ではなく、一つはポリゴン、もう一つは 3D Texture というように描画原理が異なるもののような場合。

大抵のサンプルが一つの描画原理でしか取り扱っていないからなあ。

どうしたものやら。

 

 

Mac アプリとメニュ

Mac アプリでメニュの実装をする場合、一番簡単なのは AppDelegate に書いてしまうこと。

https://qiita.com/imk2o/items/436839153530dbcb7ed1

やり方は上記記事を参考にしてほしい。

デフォルトメニューの First Responder の担当オブジェクトは AppDelegate になっているのだから、First Responder に testaction という responder を登録し、AppDelegate に以下の実装をしておけば、実行してくれる。

- (IBAction)testaction:(id)sender
{
    NSLog(@"test action");
}
AppDelegate.m

図がわかりやすい。

 

NSOutlineViewDelegate プロトコル

NSOutlineView 関連のプロトコルでは、DataSource の方は存在感があるが Delegate の影は薄い。

まあ、DataSource の方はないと表示すらできないわけだが…。

試しに

@interface OutlineviewManager : NSObject<NSOutlineViewDataSource>

@interface OutlineviewManager : NSObject<NSOutlineViewDataSource, NSOutlineViewDelegate>

としてもコンパイル自体はできる。

行選択時の機能

公式ページを見るに、行選択をした時のメソッドを供給しているようです。

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item;

のメソッドは、公式の説明だと item が選択できるかどうかを定義するもののように紹介されていますが、おそらく機能も提供できます。
OutlineView に Person クラス(のインスタンス)を表示させているとき

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item
{
Person *p = item;
NSLog(@"%@", p.name);

return YES;
}

を実装しておくと name プロパティの値(文字列)を表示してくれます。

 

cocoa プログラミング

今まで延々 GUI なしの Objective-C の記事書いてきたが、ここらで GUI つまり cocoa の話もちらほら。

Q&A 形式で。

Q Xcode 上で GUI 部品をどう出せばいいかわからない。

A 右上の + ボタンを押下する。

すると検索画面が出現するので、検索窓から button だの view だの打ち込んでパーツ選ぶ。

なお、View 関係で View 自体の大きさをウィンドウのリサイズに追従させたいときは、Autoresize 使う。

 

(続く)