2011-01-26 20 views
4

UISwitchのテキストを変更しようとしています。ウェブサイト(Changing the text on a UISwitch)のサンプルはうまくいきますが、xcodeを3.2.5とiOS 4.2にアップグレードすると、関数を呼び出してテキストを変更するとアプリケーションがクラッシュします。私はウェブサイトから次の例を使用しています。iOS 4.2のUISwitchテキストの変更

例えば、

((UILabel *)[[[[[[_agreeAgb subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:0]).text = @"Foo"; 
((UILabel *)[[[[[[_agreeAgb subviews] lastObject] subviews] objectAtIndex:2] subviews] objectAtIndex:1]).text = @"Bar"; 

nullのオブジェクトが検出されたため例外がスローされます。

ありがとうございました。

+0

私は同じ問題に直面しているのですが、どのようにして解決したのですか? – Pooja

答えて

14

これを行わないでください。フレームワークコントロールのプライベートビュー階層を操作することは絶対にサポートされておらず、OSのアップデートとの互換性を損なう可能性があります。特に、あなたのコードが階層の検証を絶対にしないので、サブビューの数やタイプが期待していたものと一致しないと、非常に簡単にクラッシュする可能性があります。

+2

これは良い答えではありません。その時の解決策は何ですか? –

+6

@ヒソカ:あなたは私の答えのポイントを逃したと思います。 –

7

4.2で成功しました。this code from hereです。カスタマイズされたUISwitchと同じように見える効果を得るために、UISlider(UISwitchではなく)をサブクラス化します。

+0

ここに+1と上記の答えに-1。本当にあなたがそれをすることはできませんが、あなたの疑問に対する真の答えは、別のラベルでUISwitchに相当するものを達成する方法です。別のオプションはここにあります。http://osiris.laya.com/projects/rcswitch/ – Rhubarb

+0

このソリューションを使用する人には、あなた自身のスイッチイメージを提供する必要があります。 iOSが新しいスタイルスイッチ(iOS 5?)に切り替えると、これを使っているアプリには*古い*と見えるスイッチがあります。新しいiOSのバージョンが表示されるので、このソリューションの一貫性を視覚的に確認する必要があります。 – Nate

0

てみiOSの6で導入されonImageoffImageプロパティを設定することで表示される内容を変更することができますカスタマイズ可能なオープンソースUISwitchの置き換えを使用しています。

これはかなり良いようです:DCRoundSwitch on GitHubしかし、それが動作しない場合、多くのGitHubにあります。

このタイプのアプローチでは、スイッチの機能と描画自体が実装され、コア機能のUIControlベースクラスのみに依存するため、同じ非互換性の問題はありません。あなたが時々更新する必要があるのは、使用しているライブラリ(DCRoundSwitch)ですが、UIControlやQuartzのような基本機能は非常に確立されており、めったに変更されないため、これはまれであり、 。