3

私は2つのタブを持つプロジェクトに取り組んでいます。最初のビュー コントローラーで、2 番目のビュー コントローラーにあるメソッドを呼び出そうとしています。Second View Controller のメソッドは、この Second View Controller の UILabel を更新します。問題は、Second View Controller が起動時に初期化されないため、メソッドが適切に呼び出されないことです。次を使用して、2番目のView Controllerを手動で初期化できます

     if (secondView==nil) {
        secondView = [[SecondView alloc]init];
    }

次に、メソッドが起動されます(メソッドにブレークポイントを配置してテストし、それがトリガーされることを確認しました)が、UILabel が更新されないため、2 番目のビュー コントローラーが別のスレッドで初期化されていると思われます。

私の質問は、同じスレッドで Second View コントローラーを初期化して、そのタブをクリックしたときに UI が更新されるようにするにはどうすればよいですか? appDelegate でこれを行う方法はありますか?

IBOutlet がラベルに正しく接続されていること、.h ファイルが正しくインポートされていること、SecondViewController のメソッドが .H ファイルに記述されていることを確認しました。

コードを以下に示します。

FirstViewController.m

-(void)myMethod
{
     [secondView updateLabel];
}

SecondViewController.m
-(void)updateLabel
{
    myLabel.text = myString;
}
4

2 に答える 2

4

「私の質問は次のとおりです。同じスレッドで2番目のビューコントローラーを初期化するにはどうすればよいですか..」

その必要はありません。コントローラーがタブ バー コントローラーにある場合、各タブのルート コントローラーは起動時にインスタンス化されます。それへの参照を取得する必要がある場合は、self.tabBarController.viewControllers[1] のようなものを使用します。これは、2 番目のタブのコントローラーになります。SecondView の別のインスタンスを作成する init one を割り当てたくありません。

ただし、secondView への正しい参照を取得したとしても、secondView のビューがまだ読み込まれていないため、ラベルを更新しようとしても機能しません。最初のコントローラーから何も渡していないため、最初のコントローラーからこれを実行しようとしている理由は、あなたの質問からは明らかではありません。これだけでよい場合は、secondController の viewDidAppear メソッドでラベルを更新するだけです。最初のビュー コントローラーから文字列を渡したい場合は、secondView に文字列プロパティを設定し、最初のコントローラーからその値を設定する必要があります。次に、secondView のラベルのテキストを viewDidAppear のその文字列に設定します。

于 2013-03-12T04:18:40.580 に答える
0

独自のAppDelegateスレッドを作成したり、操作を使用したり、非同期コールバック (非同期 URL 要求など) からの UI 呼び出しを試行したりしない限り、メイン スレッド以外の別のスレッドから実行しないでください。

ちょっと興味があります...myLabelが nil かどうかを確認できますか? もう 1 つの簡単なチェックはmyLabel、関数呼び出しを待つのではなく、ターゲット ビュー コントローラーの init メソッドで値を設定することです。

他のスレッドがあり、UI への呼び出しを実行している場合、メイン スレッドに切り替える良い方法はNSThread、次のようにクラスを使用することです。

- (void) doSomethingOnUI:(NSString*) label{
   // if the calling thread is not the main thread
   if( ![NSThread isMainThread] )
   {
        // switch to the main thread
        [self performSelectorOnMainThread:@selector(doSomethingOnUI:) 
                               withObject:label 
                            waitUntilDone:YES];
        return;
   }

   [self.myLabel setText: label];
}
于 2013-03-12T02:37:24.357 に答える