グローバル変数を定義するなど、知っている別のコントローラーからラベルのテキストを変更したいと考えています。
5 に答える
そのプロパティを定義して作成し、AppDelegate で UILabel を割り当てます
アプリケーション全体で必要な場所でそのラベルを使用します
AppDelegate *objAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[self.view addSubView:objAppDelegate.label] // your gobal label added
テキストをどこでも変更
[objAppDelegate.label setText:@"New Text"];
それを行うには複数の方法があります。ただし、質問をより具体的に表現することもできます。
ラベルを他のViewControllerからアクセスできるようにすることができます。そのためには、ラベルにアクセスしたい場所から、所有しているViewControllerを知る必要があります。
ラベルへの参照をUIApplicationDelegateのサブクラスに保存し、[[UIApplication getSharedApplication]デリゲート]を使用してそれにアクセスし、どこからでもアクセスできます。そうする場合は、ラベルが破棄されたときにその参照をゼロにすることを忘れないでください。
ただし、何を達成したいのか、そしてその理由をもう少し知らなければ、これが推奨されるかどうかはまったくわかりません。ビューのコントローラーの外部からUILableオブジェクトにアクセスできるようになります。おそらくそうではありません。
特定のプログラミング規則と制限を強制する iOS 5 での自動参照カウントの導入により、特定のプログラミング構造と受け入れられた慣行はもはや不可能です。extern の使用は、リンカが嫌う C ベースのディレクティブの 1 つです。実際、ARC を有効にして使用しようとすると、リンク エラーが発生します。
ただし、iOS 5 でグローバル変数を使用することはまだ可能です。#define ディレクティブを使用するだけです。
次の手順は、グローバル変数を使用するための 1 つの解決策を示しています。
1) グローバル変数の宣言:
NSString * gvar;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
2) グローバル変数の初期化:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
gvar = [[NSString alloc] initWithString:@"Name1"];
return YES;
}
3)この AppDelegate ファイルを両方の ViewController にインポートします。
4) 最初の ViewController で gvar を UILabel に割り当てる:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.label.text= gvar;
}
5) 2 番目の ViewController から値を変更します。
gvar = [self.songArray objectAtIndex:indexPath.row];
前の viewController に戻ると、ラベルに新しいテキストが表示されます。
a) ラベルへのポインターをコントローラー B に渡し、それを使用してテキストを変更します。
b) プロトコルを定義し、コントローラー B でデリゲート メンバーを定義します。コントローラー A (ラベルを所有する) でデリゲート メソッドを実装し、デリゲート メソッドのパラメーターとして渡されるテキストを設定します。コントローラー B でデリゲート メソッドを呼び出し、設定するテキストをラベルに渡します。
c) コントローラー A をオブザーバーとして何らかの通知に登録します。コントローラー B に通知を送信し、テキストをユーザー情報辞書に追加します。通知を受け取り、渡されたテキストをユーザー情報ディクショナリに設定するメソッドをコントローラ A に実装します。
b) ほとんどの場合、最も合理的です。a) きれいではありません。c) やり過ぎです。
それにはプロトコルを使用したほうがよいと思います