Hatena::Groupiphone-dev

Ni chicha, ni limona - 平均から抜けられない僕

2009-08-08

[iPhone][bug] iPhone OS SDK2.2.1のUISegmentedControlにある不具合(3.0では解消) 19:32  [iPhone][bug] iPhone OS SDK2.2.1のUISegmentedControlにある不具合(3.0では解消) - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [iPhone][bug] iPhone OS SDK2.2.1のUISegmentedControlにある不具合(3.0では解消) - Ni chicha, ni limona - 平均から抜けられない僕  [iPhone][bug] iPhone OS SDK2.2.1のUISegmentedControlにある不具合(3.0では解消) - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

ご存知の方も多いかと思いますが、表題の不具合で困ってしまっていたのでメモメモ。


UISegmentedControlクラスで、表示するスイッチを全て削除するためのメソッド:


- (void) removeAllSegments

は、2.2.1だとスイッチの上に表示しているビューや文字列が削除されるだけで、スイッチそのものは残ったままになってしまいます。だからその後にremoveSegmentAtIndex:animated:メソッドを使うと、「【挿入された新しいスイッチ】+【これまでのスイッチ(ただし空白)】」という状況に陥ります。


これを回避するためには1つずつ削除するメソッドを使って、


	// スイッチから全要素を削除
	NSUInteger segmentsInSwitch = _segmentedSwitch.numberOfSegments;
	for (int i=0; i<segmentsInSwitch; i++) {
		[_segmentedSwitch removeSegmentAtIndex:0 animated:NO];
	}

としてあげます。

ちなみに3.0(たぶんそれ以降も)では、removeAllSegmentsでちゃんと削除されましたので、同メソッドを一発呼んであげればOKです*1


補足(自分がハマったもう1つのこと)

ちなみに上記でスイッチの数を減らしたり増やしたりするタイミングで、UIControlEventValueChanged(=ボタンの値が変化したときに反応するタイプ。IBではデフォルトでこの属性が付く)で登録したメソッドが呼ばれるので注意です。


自分の場合だと、このスイッチを押下したときに呼ばれるメソッドで、ある変数を書き換える処理を記述していたところ、「ボタンを押してもいないのに勝手に変数の値が書き換えられている」という一見不可思議な動作をしてくれて、しばらく悩みました。


結局、「今はボタンの情報操作中です」というメンバー変数を持たせておき、そのフラグが立っている間はイベントが飛んでも無視するようにして回避しています。



以上、この日記を書いている現在はまだまだ2.2.1ユーザーも多いので3.0以降用のアプリを出す勇気がないpaellaでした。

*1:ただしアニメーションの指定はできないので注意

ゲスト



トラックバック - http://iphone-dev.g.hatena.ne.jp/paella/20090808