1

別のクラスのビューを更新できるようにしたいのですが、試したことは何も機能していません。私のアプリケーションは、いくつかのタブが設定されたタブ付きアプリケーションです。ViewController1クラスにrefreshというメソッドがあります。これは次のようになります。

-(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];

}

では、なぜこのメソッドが他のクラスから機能しないのでしょうか。私が望んでいるのは、別のクラスから、またはアプリケーションがロードされたときにビューを更新できるようにすることですが、機能するものが見つからないようです。

誰かが私を正しい方向に向けることができれば、とてもありがたいです!

編集:明確にするための更新

さて、私が今のところ嫌いなことをしたのはこれです

exit(0);

AppDelegatesApplicationDidEnterBackgroundの内部。これはある程度は機能しますが、理想的なソリューションではありません。

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

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

4

2 に答える 2

3

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

ただし、これはおそらく少し抜本的です。

画面上にあるインスタンスと通信するのではなく、View Controllerの新しいインスタンスを作成しているため、アプリケーションデリゲートから更新するための現在のコードはスターターではありません。

このため、プロセスにアプリケーションデリゲートをまったく関与させないことが最善です。

代わりに、View Controllerは、通知のオブザーバーとして自分自身を登録し、自分UIApplicationDidBecomeActive自身に必要なことを何でも行うことができます。通常、この通知はviewDidLoadで登録し、viewDidUnloadで登録解除します(定義上、ビューをアンロードした場合は、アプリが起動したときにビューを更新する必要がないためです)。

次のように登録します(将来のブロックを使用します)。

オブザーバーオブジェクトを保持するためにタイプidのivarを宣言しますbecomeActiveObserver。この場合はそれを呼び出しましょう。したがって、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;

同様のパターンに従って、アプリ内の他の場所から通知(独自の通知またはシステム通知)を取得できます。これは、結合がはるかに緩いため、すべてをアプリデリゲートに渡すよりも優れた設計です。

于 2012-05-14T19:29:57.060 に答える
2

clickMeはボタンに対するアクションだと思います。起動時にビューコントローラーを更新する場合は、クリックミーに似た関数またはビューを更新する関数をviewcontrollerに追加し、applicationWillEnterForegroundメソッドから呼び出すか、これを試してみてください:-

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

アプリケーションで必要な場合は、appDelegateのapplicationWillEnterForegroundメソッドでファイルを変更できます。

于 2012-05-11T14:57:25.847 に答える