UIViewが重なってしまうので再描画しようとしてたら、もっと重要な事に気がついた件について


Objc

夏です。 お盆です。

実家に帰ってきましたが、引きこもってiPhoneアプリ開発に勤しむ事にしました。
未だにObjective-Cは色んなところで躓いたりしているんですが、今日もsubviewの描画一つで盛大にハマってしまいました。
という事でMCハマーエントリ。

設定を変更した後に、viewを描画しなおしていたら異変が

初心者すぎてほんとに自分が恐ろしいですわ。

いま作ってるアプリで、ある設定値を変更すると画面の中のsubviewを更新するっていうヤツやりたかったんですが、クッソはまってしまいました。

最初は設定値を変更した後に uiscrollviewをまるごと描画し直そうとして、uiscrollviewをremoveFromSuperViewとかしてたら、画面真っ白になっちゃって、ハァ。。 とか思ってたら
UIScrollViewはoutlet接続でストーリーボードで貼り付けたのでプログラム中でadd してなかったわ、すいません。みたいな小芝居をしていました。

その後、subviewを生成する箇所だけやり直せばいいのかー っと思って単純にsubviewを更新するとlabelが重なってしまうっていうー。
単純に設定値を監視して変更があった場合はviewを再生成してました。
で、こんな感じ↓


Subview

labelの箇所がなんか設定変更後のlabelが上から重なっとるやないか。

どげんがせんと。 ていうか私も@odailly_jpさんみたいにブログにカッコイイ綺麗な図を挿入したい。なんだこれは。

ちなみに全体像

画面はこんな感じで↓ uiscrollviewの中にいくつもsubviewある感じ。


Uiview

とりあえずUIScrollViewはストーリーボードで貼っつけたので、プログラムの中では初期化できない(?) いやわかんないっすけどalloc initしたら怒られたんで。。

というわけで、subViewの中身を変更時に抹殺する事にしました。
なお、addSubviewしたviewを削除するメソッド [view removeFromSuperview];が、ありますが
あるUIViewの中にあるsubviewを全員消し飛ばすイディオムがありました。

for (UIView *view in [self.view subviews]) {
    [view removeFromSuperview];
}

ちなみに今回は、uiscrollviewの中身を消したいので
self.scrollview
で指定して中身を消しました。

反省点

たまたま今回、labelが重なってるのを発見して古いviewの上にaddSubviweしてる事を気がついたので古いviewを消しましたが、設定値変更するイベント毎にこれをしていたらsubviewが無限に重なり合うのでメモリリークですってね。
今後はちゃんと私もメモリ管理能力を養っていきたいと思います。

余談ですが、ほんとにアプリをリリースするぜー っていう直前になって色んな箇所でバグを発見したりなんやかんやで全然出せへん。。 気合が足りんのだろうか。

 

 

2014-08-15 | Posted in Objective-CNo Comments » 


関連記事

Comment





Comment



*