web-dev-qa-db-ja.com

UILabelテキストが更新されていません

UILabelテキストを変更できません。 viewDidLoad内のUILabelのコードは次のとおりです。

startLabel=[[UILabel alloc] initWithFrame:CGRectMake(75, 395, 200, 30)];
startLabel.text=@"Recording Sound ...";
startLabel.backgroundColor=[UIColor clearColor];
startLabel.textColor=[UIColor whiteColor];
startLabel.font=[UIFont boldSystemFontOfSize:17];

[self.view addSubview:startLabel];

後で、次のコードでテキストのラベルを変更したい場合、アプリでは変更されません:

startLabel.text=@"Searching Database ...";

または

[startLabel setText:@"Searching Database ..."];

UILabelは空ではありません。デバッグ中に出力しましたが、次のように表示されます。

(gdb) po startLabel
<UILabel: 0x2c1a30; frame = (75 395; 200 30); text = 'Searching Database ...'; 
clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x2ae8f0>>

そのため、ラベルのテキストはUILabel内で変更されますが、画面上では更新されません。

誰かが親切に私にここで何が欠けているのか教えてくれますか?ありがとう。

編集1:performSelectorOnMainThread:-私には役に立たなかった。編集2:AVFoundationおよびASIHTTPクラスを使用して、音声を録音し、録音したファイルをここにアップロードします。他に何もありません。スレッドを使用しませんでした。

36
Ahsan

上記のコメントで述べたように、スレッドの問題に直面している可能性があります。メインスレッドで実行され、何らかのアクティビティ(データベースの検索など)を行うメソッドがある場合、UIに対して行った更新は、実行ループが制御を取得するまでコミットされません。そのため、メインスレッドで長くて時間がかかるタスクがある場合は、ラベルのテキストを設定した後に次のコードを実行します。

- (void)doSomethingTimeConsuming
    ... consume some time ...
    ... set text of label ...
    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
    ... continue long operation ...
}

これにより、行ったUIの変更がすべて消去されます。これは賢明で機能的なハックかもしれませんが、代替手段に勝るものはありません。バックグラウンドスレッドでアプリの時間のかかるタスクを実行し、performSelectorOnMainThread:withObject:waitUntilDone:を使用してメインスレッドからUIを更新することを強くお勧めします。 Appleの iOSスレッド管理 のページをご覧ください。

47
Alex Nichol

私の場合、更新中の関数はスレッド上のタッチ認識機能から呼び出されましたが、ラベルのテキストプロパティの値を変更する関数内の場所をメインスレッドに戻しました。

dispatch_async(dispatch_get_main_queue(), ^{
    [self.someLabel setText:someString];
});
49
ndoc

私の場合は合理的ではありますが、少し予想外です。

どこかで発射したUILabelを受け取ったら、NSNotificationを更新することになっています。ただし、通知はバックグラウンドスレッドから起動されたなので、ラベルのテキストを更新するリスナーメソッドもバックグラウンドで起動されます。

ラベルまたはビューを更新するためにNSNotificationに依存している場合は、メインUIスレッドからNSNotificationを起動してください。

3
Matthew Quiros

UIViewControllerの新しいレベル番号に更新されないレベル番号を示すUILabelがありました。私が見つけた唯一の実行可能な解決策は、UILabelを所有していたView ControllerのメインスレッドでsetNeedsDisplayを呼び出すことでした

-(void)changeLevelLabel:(int)theLevel {
dispatch_async(dispatch_get_main_queue(), ^{
    self.levelLabel.text = [NSString stringWithFormat:@"%d",theLevel];
    [self.levelLabel setNeedsDisplay];
});

}

http://iosdevelopmentjournal.com/blog/2013/01/16/forcing-things-to-run-on-the-main-thread/ を参照してください。

2
user1233894