2012-05-11 7 views
1

別のクラスのビューをリフレッシュできるようにしたいが、何も試していない。私のアプリケーションは、いくつかのタブが設定されたタブ付きアプリケーションです。私は、このようなViewController1クラスのリフレッシュと呼ばれるメソッドを持っていますiPhoneが別のクラスからのビューをリフレッシュする

-(void)TestMe{ 


    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"widgjson" ofType:@"json"]; 
    NSData *myData = [NSData dataWithContentsOfFile:filePath]; 

    NSString *responseString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docDir = [paths objectAtIndex: 0]; 
    NSString *docFile = [docDir stringByAppendingPathComponent: @"json.txt"]; 
    [responseString writeToFile:docFile atomically:NO encoding:NSUTF8StringEncoding error:Nil]; 

    [self loadView]; 
    [self viewDidLoad]; 
} 

これは問題なく動作します。アプリケーションが最初にロードされると、別のJSONがロードされます。このボタンをクリックすると、新しいJSONがロードされ、ビューが更新されます。これは爽やかさをテストするための一時的なものです。しかし、別のクラスやAppDelegatesのApplicationDidEnterForegroundメソッドからこのメソッドを呼び出せば、何も起こりません。

-(void)TestMe{ 


    ViewController1 *vc = [[ViewController1 alloc] init]; 


    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"widgjson" ofType:@"json"]; 
    NSData *myData = [NSData dataWithContentsOfFile:filePath]; 

    NSString *responseString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docDir = [paths objectAtIndex: 0]; 
    NSString *docFile = [docDir stringByAppendingPathComponent: @"json.txt"]; 
    [responseString writeToFile:docFile atomically:NO encoding:NSUTF8StringEncoding error:Nil]; 

    [vc loadView]; 
    [vc viewDidLoad]; 

} 

なぜこのメソッドは他のクラスでは機能しないのですか?私がしたいのは、別のクラスからのビューを更新することができるか、またはアプリケーションが読み込まれたときにビューを更新できることですが、動作するものを見つけることはできません。

誰かが私を正しい方向に向けることができれば非常に感謝しています!

EDIT:UPDATING

オーケーを明確にするために、私は、私は好きではない当面のために行っていることは、この

exit(0); 

インサイドAppDelegates ApplicationDidEnterBackground置かれています。これはある程度は機能しますが、理想的な解決策ではありません。

私がしたいことは、アプリケーションを再び開くと、AppDelegateが再び実行されてタブを設定することです。サーバーから取り出されたJSONがタブの順序に影響を与える可能性があります。そのため、AppDelegates ApplicationDidFinishLaunchingメソッドを再度ロードする必要があります。

また、アプリケーションの別のクラスからこれを行うことができますか?私のアプリケーションが初めて読み込まれると、ユーザーの電話番号が尋ねられます。ユーザーの電話番号はサーバーに送信され、PINが生成されます。これが完了したら、AppDelegateメソッドをロードして、タブやオーダーなどの設定を開始します。

答えて

3

アプリケーションがバックグラウンドで実行されないようにするために、終了して再入力するときに強制的に再読み込みするには、UIApplicationExitsOnSuspendキーをinfo.plistのYESに設定します。

しかし、これはおそらく少し劇的です。

アプリケーションデリゲートから更新するための現在のコードは、画面上にあるものと対話するのではなく、ビューコントローラの新しいインスタンスを作成するため、非スターターではありません。

この理由から、このプロセスではアプリケーション代理人を関与させないことをお勧めします。

代わりに、あなたのビューコントローラはUIApplicationDidBecomeActive通知のオブザーバとして自分自身を登録し、自分自身に必要なものを実行できます。通常は、この通知のためにviewDidLoadに登録し、viewDidUnloadを登録解除します(ビューをアンロードした場合は、アプリケーションのバックアップ時にリフレッシュする必要はありません)。

次のようにして、(彼らが将来あるとして、ここでブロックを使用して)登録します:

のは、この場合にはbecomeActiveObserverそれを呼びましょう、オブザーバオブジェクトを保持するために、id型のIVARを宣言します。だから、あなたのイヤリングを宣言しているところなら、id becomeActiveObserverを付け加えてください。その後、のviewDidLoadで:

becomeActiveObserver = [[NSNotificationCenter defaultCenter] 
addObserverForName:UIApplicationDidBecomeActive 
object:nil 
queue: nil 
usingBlock:^(NSNotification *note){ 
    //put your reloading code in here 
    [self TestMe]; 
}]; 

そしてviewDidUnloadにそうように削除します。

[[NSNotificationCenter defaultCenter] removeObserver:becomeActiveObserver; 

あなたはどこか他のあなたのアプリ内からの通知(あなた自身、またはシステムのもの)をピックアップして同様のパターンをたどることができます。これは、アプリケーションのデリゲートを通してすべてのものを渡すよりも優れた設計です。

+0

興味深いことに、iPhoneプログラミングの新機能は、通知センターの使い方があまり分かりませんでした。私はあなたのコードを試しましたが、usingBlockの部分の周りにエラーメッセージが出てきました。 "void(^)(NSNotification * __ strong) '型のパラメータに' void(^)(void) また、このコードは、IOSが5.0未満の電話機でも使用できますか。 – AdamM

+0

申し訳ありません、パラメータを忘れました - 編集を参照してください。これは4.0以上で動作します。 – jrturton

+0

コードは完璧に動作します、ありがとうございます!!!アプリのデリゲートメソッドを使用していることを理解しようとした時代を過ごしたが、この方法は簡単です。再度、感謝します!!!! – AdamM

2

clickMeは、起動時にviewcontrollerを更新してから、

- (void)applicationWillEnterForeground:(UIApplication *)application 
{  
NSLog(@"app will enter foreground");  
[viewController clickMe:NULL]; 
} 

と、アプリケーションが必要な場合は、appDelegateのapplicationWillEnterForeground方法でファイルを変更することがあり - :clickmeに類似のViewControllerまたはビューをリフレッシュし、applicationWillEnterForegroundメソッドからそれを呼び出すか、あなたはこれを試すことが任意の関数内の関数。

+0

私はすでにそれを試してみましたが、それはうまくいきませんでした。私はまた、テストするためにその機能の空のバージョンがあります、運はありません。迷惑なのは、NSLOG(@ "test")を持っているかのようにViewDidLoadを再び実行することです。 viewDidLoadでは、アプリケーションが読み込まれるたびに再度印刷されますが、印刷されたステートメントとは別に動作するものはありません。私はloadview関数を使ってすべてをクリアしてからviewdidloadを呼び出してリロードしましたが、printステートメントから離れたものは何もありません。理由はわかりません。 – AdamM

+0

viewdidloadと他のviewDidからリフレッシュコードを移動します...別の関数と呼び出しその関数はapplicationWillEnterForegroundから(そしてあなたのviewDidからも)呼び出されます。 – alinoz

関連する問題