怒りのプログラミング

こんなポンコツがプログラマとして生活していることに驚きを禁じえません。 *ご指摘等あればお気軽にコメントください

ネストしたFragmentのライフサイクル管理

ネストしたFragmentのライフサイクル管理をどうするか?

例えば、FragmentTabHost+ViewPager+ViewPager内に表示するFragment(他にはどんなのがあるかな?)というような構成だと、FragmentTabHostでタブを切り替えた時にViewPager内に表示するFragmentのインスタンスを破棄したくないとき。

FragmentManagerでFragmentを切り替えるとき、インスタンスを破棄する切り替え方はattach<->detach、裏で生かしておく切り替え方はshow<->hide。でも、FragmentTabHostだとタブ(Fragment)切り替え時にattach<->detachで行っている(多分。ここをshow<->hideでやってもらう方法が無いような気がする)。

また、FragmentTabHostとTabHostで何が違うかと言えば、FragmentTabHostはコンストラクタでFragmentManagerを引数に取り、Fragmentの管理を勝手にやってくれる。

ということで、FragmentTabHostにFragmentの管理を任せるんじゃなくて、TabHost+FragmentManagerで自分でFragmentの管理をすればよいのかな。そこでshow<->hideすると。

まだ理解が足りないところがある。Fragmentは難しいなー。

eclipseでアプリを作りたいわけではないがAndroidのライブラリは使用したい場合のプロジェクトの作成方法

アプリを作リ始めるときと同じように、

File > New > Android Application Project

を選択し、プロジェクト作成ウィザードを進めていく。

f:id:aquos2800:20150307225318p:plain

上の画面が出てきたら、Create activityのチェックを外す(アイコンもいらないと思うんでCreate custom launcher iconのチェックも外しておく)。

この設定でプロジェクトを作ると、srcフォルダに何のファイルも生成されないので、あとはお好みで好きなように作ってください。

たぶん、Androidライブラリを利用した自作ライブラリを作りたいときなんかにこれやると思います。

環境:

eclipse 4.2

Android Developer Tools 23.0.2

NSTableViewに動的にViewを追加するときにレイアウトを指定したい

ちょっと時間がないので箇条書きでメモしておく。

全然わからなくて、半日以上詰まった。もー!

NSButtonをテーブルビューにセットしたいが、変な位置にボタンが設定されちゃうので、ダミーのNSViewを作り、そのダミーのビューのサブビューとしてNSButtonを設定する。これでframeの設定が反映された。

  • tableView:viewForTableColumn:row:メソッド内で

  • NSButton *button = [[NSButton alloc] initWithFrame:NSMakeRect(10, 10, 30, 30)];

  • NSView *buttonViewBase = [[NSView alloc] init]; // ダミーのビュー

  • buttonに対して色々設定する

  • [buttonViewBase addSubView:button];

  • return buttonViewBase; ← tableView:viewForTableColumn:row:メソッドの戻り値に設定

たぶんねー、これ間違ってると思うんだわ。

でも他にいい方法がわからないし。Appleのドキュメント(View Programming Guide)読んでも見つかんねー!


また今度追記します。 もう一回リファレンス読んだほうがいいような気がしてきた。

Javaと比べたときのObjective-Cの感想

今はMac OS Xのアプリを作っています。

Objective-Cを勉強し始めて2ヶ月ほど経ちました。ここまでの理解のところで、Androidアプリの開発で使っていたJavaと比べて受けた印象を書いておきます。勘違いしているところがあるかもしれないけど、今後理解が進むとうれしい。

気に入らないところ

抽象クラスがない

@protocolを使って、Javaのinterface相当なものができるけど、Javaのabstract相当の機能はない。 クラスの継承はできるけど、スーパークラスメソッドの実装の強制ができない。

Javaの例外相当の機能が(実質的に)ない

NSExceptionクラスがJavaのException相当、かと思ったけど、JavaのExceptionとObjective-CのNSExceptionは使い方が違う。

ファイルの入出力の失敗、通信の失敗、とかにはNSException(@try-@catch-@finally)を使ってはいけない。

じゃあどう書くのかっていうとNSErrorクラスになるみたいだけど、NSErrorのポインタを用意して、エラーが発生する可能性があるメソッドに渡して、メソッドが返すNSErrorのインスタンスでエラーを確認、って流れがなんか面倒。言語で例外を扱う機構が無いと、なんだか記述が統一されなくて気持ち悪い気がする。

じゃあじゃあ、もうgoto文でいいのかな、とも思っちゃう。これどうすべきなんだろう。みんなきっちりNSErrorで処理してんのかな。

ジェネリクスがない

やっぱり怖いよね、これは。ジェネリクスが無い頃のJavaを知らないけど、絶対あったほうがいいよなあ…

と言っていたが、会社の先輩と話したところJavaが型に厳格なのに対し、Objective-Cは動的な型づけだからジェネリクスという考え方が要らない(たしか。細かい話は覚えてないです)という話だった。まあ、ジェネリクスって型をパラメータで扱えるようにして、型を決定するタイミングを遅らせることで型でガチガチだったクラスやメソッドがもうちょっと柔軟に書けるよ、という話だと思ってるので、最初からルーズなObjective-Cにはそもそも関係ない概念ということ?Objective-Cの型システム(というか、それを利用するCocoaフレームワーク)についてもっと勉強しないと理解できない話だと思った。もっと勉強しよう。

namespaceがない

これは正しいよね?そもそもJavaもnamespaceではなくてパッケージだけど、Objective-Cにはそれすらない。だからNS...のような命名規則が要るんだよね?

メソッドオーバーロードがない

ラベル名が違うと異なるメソッドとして扱えますが、第一引数にはラベル名が付けられないので無理です。

nilにメッセージ送信するとnilが返ってくる

Javaぬるぽがあんなにありがたいものだったとは。

気に入っているところ

メソッド命名規則

無駄に長くなるという意見をよく見かけるけど、僕は英単語が略されていると気持ち悪いので、なるべく略さず書く、という流儀はうれしい。

と思ったけどJavaも割りと略さない主義だよね。Javaも好き。

@property, @synthesize

なぜJavaでは採用されなかったのかな?C#にはある。

Xcodeのテスティングフレームワークのとっつきやすさ

なんのプラグインeclipseの話。Xcodeにはそもそもプラグインがあるのか?)もライブラリも追加せず、プロジェクトを作るといきなりテストが書けるのが良いと思う。ありがたい。すぐサボるので、ユニットテストを積極的に書いていきたい。


また今度追記しよう。コードもメモっておきたい。

あと、テストについては色々思うことがあるなあ。いろんな人の意見を吸収しながら自分なりの考えを持っておきたい。

編集:

2/5 メソッドオーバーロードについて追加。書こうと思って忘れてました。 2/23 ジェネリクスのところを編集。

応用情報受かったよ

良かった!

午後試験の一問目にいきなり聞いたことない略語が出て来て焦ったけど、他でなんとかなってたか。絶対出るって分かってるんだからもっとセキュリティ関係の勉強しとけって話だけど。

とにかく60点とれてたからよし!

だけど、応用情報取れたからって言っても別になんもできないダメプログラマだなあ。

それでも、情報系の技術のキーワードを広く浅ーく知るという意味では資格のために勉強してよかったと思う!

次は高度試験のどれかを受けてみようかな?絶対無理だなあ。

コードをバシバシ書ける人になるのが先か。


お金の話。

会社に申請すると報奨金がいただけます。ありがたや。

色々な資格に対して報奨金が出て、資格のランクごとに金額が違うんだけど、応用情報は英検1級と同じランクなのね?

英語をナメすぎだと思う。

safariのアドレスバーを選択すると毎回お気に入りが表示される

これ。

f:id:aquos2800:20141119214747p:plain

safari8で検索しようとすると毎回お気に入りが表示される。

いや、う、う、うざ!!!!!

というかこれお気に入りが表示されてるって気づかないよ。

デフォルトでアップルとかグーグルとかLinkedinなんかがお気に入りに入れられてるから、そもそもこのランチャみたいなやつはお気に入りが表示されてるんだってことすら気づかなかったよ。

Objective-Cを触り始めたばかり、全然分からずググろうとしたら毎回これだもの、もしディスプレイをカチ割ったとしてもAppleCareの対象になるんだろうな。うん。なるわ。

消し方です。safariの「環境設定」から、

f:id:aquos2800:20141119214730p:plain

「検索」タブの「お気に入りを表示」のチェックを外す。

f:id:aquos2800:20141119214753p:plain

この機能嬉しい人いるの?


これからも、永遠のビギナーとして悪態をつき続けていく…!