CoreData: Master-Detail の Detail でハマる。

CoreData はマジ鬼門。Master で add して、Detail に遷移する。Detail には、Master の情報のほか relation した N の record も表示したいわけだ。

ここですっかりはまってしまったのが、Detail、つまり、tableView で表示している cell に UIView とUILabel を組合せて Prototype Cell を構成していた。こうした場合、program 側でどうやって UIView と UILabel を捕まえるのか。Storyboard から Ctrl + クリックで紐を引っ張ってこようとしたら、Storyboard は表示されるけど、assistant view を選ぶと、満足に .h ファイルが選べない。header ファイルで指定している h ファイルを command + クリックして無理無理ファイルを開いたりして、Ctrl + クリックで紐を引っ張っても、目的通り Outlet が記述されない。こういうことがあるから、tag で番号指定して、program 側では次のような感じで tag 指定して class を取り出せた。

STBadge* view = [cell viewWithTag:1];

次に、Cell には UIView と UILabel を配置した訳だが、UIView では、UIBezierPath で図形を描写し、さらに、その中に UILabel を program で配置していた。UIView は別クラスで定義して、drawRect の中で UIBezierPath を描写し UILabel を addSubview している。

Detail で addXXXObject したら、なんか表示がおかしい。UIBezierPath で描写した図形の色と UILabel の text が意図通りのものになっていない。なんかおかしい、なんでなんでと思って調べてみたら、reloadData した方がいいのかなと気づいて、[view reloadData];  してみたら、半分うまくいった。reloadData することで、UIBezierPath は意図通りの色が出るようになった。でも、UILabel の表示がおかしくて、具体的には、record を追加したら、cell が下にずれるんだけど、前に表示しいていた UILabel がそのまま残っていて、UILabel の上に新たに UILabel が表示されるような形になってしまい、明らかに表示がおかしくなる。文字が重なって読めない。ってか、重なるようにしたつもりもなくて、reloadData したときに UILabel も合わせて再描写しろよと思ったんだけど UILabel は前のが残っていてその上に重なってしまう訳だ。

えーどうやって解消するの?と、これ以上改良のしようがなかったんだけど、Master の m ファイルを見てみたら、ここら辺の処理は fetchResultsController とか使ってる?ような印象で、見様見真似で delegate method コピペしてくるも、なんかうまくいかない。そもそも fetchResultsController ってなんだよ?という理解が乏しいので、付け焼き刃でうまくいく訳ない。

しょうがないので、今度は、program で記述するのを諦めて、Storyboard で、Prototype Cell の UIView の内部に UILabel を配置してみた。UILabel に tag を指定すれば program 側で UILabel を取出せるはず。やってみたら、案外うまくいって、なるほど、こうやるのかという感じ。

ふうぅ、ようやくうまくいった。次は、ボタンをタッチしたときの地名を保存するようにしないと・・・