※ ChatGPTを利用し、要約された質問です(原文:NSThread中にテキストフィールドが更新しない)
NSThread中にテキストフィールドが更新しない理由と解決策を教えてください
このQ&Aのポイント
NSThread中にテキストフィールドが更新しない理由を教えてください
スレッドの起動と停止を行うプログラムを作成しましたが、テキストフィールドが更新されません
テキストフィールドの更新が正常に行われないため、原因と解決策を教えてください
NSThread中にテキストフィールドが更新しない
次のようなプログラムを作成し、スレッドの起動と停止を行うことができたのですが、
スレッド中に 1の命令でテキストフィールドが更新されません。
ちなみに2のログはAll Output画面でiCntの変化が確認できます。
原因等ご存知のかたいらっしゃいましたらご教授頂けないでしょうか。
// BOOL bLoopFlg .hで定義
// int iCnt .hで定義
// txt06_01 テキストフィールド(UITextField)
///////////////////////////////////
// スレッドの開始
-(void)StartThr{
if(bLoopFlg == TRUE)
return;
iCnt = 0;
bLoopFlg = TRUE;
[NSThread detachNewThreadSelector:@selector(Thread01)toTarget:self withObject:nil];
}
///////////////////////////////////
//スレッドの停止
-(void)StopThr{
bLoopFlg = FALSE;
}
///////////////////////////////////
//スレッド
-(void)Thread01{
NSAutoreleasePool* pool;
NSAutoreleasePool* internalPool;
pool = [[NSAutoreleasePool alloc]init];
//bLoopFlgがfalseになるまで実行
while(bLoopFlg)
{
internalPool = [[NSAutoreleasePool alloc]init];
//1.テキストフィールド更新
self.txt06_01.text = [NSString stringWithFormat:@"%i",iCnt];
//2.ログ
NSLog(@"data:%i",iCnt);
iCnt++;
[internalPool release];
}
[pool release];
[NSThread exit];
}
お礼
ご回答頂きありがとうございます。 おっしゃる通りinputText の構文を実行してもテキストフィールドに反映されるのはメソッドを抜けてからでした。 「ボタンが押された」等のイベント処理時はこのような現象は納得できるのですが、Mac-ObjectiveCではスレッドを起こしてもテキストオブジェクト等のリアルタイムな書き換えができないのですね。Windows-VCで組む時はスレッドから普通にテキストオブジェクトを書き換えているのでちょっとしたカルチャーショックです。 教えて頂いた通りNSTimerを使用した所テキストフィールドのリアルタイムは表示が出来ました。 問題は解決です助かりました。 // NSTimer *tmr; //タイマー .hで定義 // int iCnt .hで定義 // txt06_01 テキストフィールド /////////////////////////////////// // タイマーの開始 -(void)StartTmr{ if( tmr == nil ){ tmr = [NSTimer scheduledTimerWithTimeInterval:0 // インターバル target:self // メソッドのある場所 selector:@selector(TmrMes:) // メソッドの指定 userInfo:nil // メソッドに渡す情報 repeats:YES]; // 繰り返し実行 } } /////////////////////////////////// // タイマーの停止 -(void)StopTmr{ [tmr invalidate]; //タイマー停止 tmr = nil; } /////////////////////////////////// // タイマーメソッド -(void)TmrMes:(NSTimer*)timer{ NSLog(@"data:%i",iCnt); txt06_01.text = [NSString stringWithFormat:@"%i",iCnt]; // iCnt++; }