3

の「再取得」および「使用」ボタンのテキストを設定しようとしていますPLUICameraViewController。ビュー階層をプログラムでナビゲートしたところ、いくつかUIButtonLabelのオブジェクトが見つかりました。これらのテキストをログに記録すると、「再取得」、「キャンセル」などの期待どおりの結果が得られます。ただし、テキストの設定は機能しません。ボタンは元のテキストをそのまま保持します。これが私が試したことです:

if (q is a subclass of UIButtonLabel)
    if ([q respondsToSelector:@selector(setText:)])
        [q performSelector:@selector(setText:) withObject:@"zzz"];

コードはクラッシュなしで実行されます。また、respondsToSelector は YES を返しています。ボタンのテキストを更新するにはどうすればよいですか?

ところで、カスタム ボタンや独自のビューなどを含む他のアプローチを認識しています。上記のコードが機能しない理由について、Objective-C/ランタイム/iOS の観点から非常に興味があります。

また、私はこれを行っていることに注意してください

 navigationController:willShowViewController:viewController:animated:
4

1 に答える 1

5

この場合、プライベート API自体の問題ではないと思います。これがまさにUIButton仕組みです。

はい、ボタンのタイトルは ですUILabel。実際には、おそらく/現在はプライベート クラスUIButtonLabelのインスタンスです。ただし、Apple がタイトル テキストを変更する方法は、メソッドUIButton自体を使用することです。

[self.button setTitle: @"newTitle" forState: UIControlStateNormal];
[self.button setTitle: @"newTitle" forState: UIControlStateSelected];

ボタンのサブビュー階層にドリルダウンしようとする代わりに、ボタン ラベルを見つけて を呼び出しますsetText:

関連する API ドキュメントは次のとおりです。

なぜうまくいかないのかというと、それは Apple がそのようにしたいからだと思います 。

1 つには、ボタンのタイトルを変更することは、通常の使用例であると予想されます。UIButtonそのため、便宜上、インターフェイスで直接簡単に呼び出せるメソッドを提供したいと考えていたのでしょう。ビュー階層にドリルダウンすることを強制された場合、より多くのコードを記述する必要があるだけでなく、Apple がボタンの基本的な実装を変更するのが少し難しくなります。後で変更する機能を保持したい場合があります。そのためには、ある種のラッパー API をUIButtonレベルで保持することをお勧めします。

また、ボタン ラベルのテキストを直接変更すると、ラベル テキストがボタンの状態(通常、強調表示、選択など) に依存するデザインを回避することになります。すべての状態の場合、デザインは状態に依存するテキストを許可するため、基になるものを非表示にすることで、UIButtonLabelこのデザインを強制するのに役立ちます。

それが彼らの動機についての私の推測です。

したがって、これを強制するために、の実装でUIButtonLabel setText:、ボタンが初期化された後にテキストを更新することを拒否する可能性は十分にあります。その後、setTitle:forState:メソッドを使用する必要があります。

于 2013-01-02T01:34:58.010 に答える