2

私は次の要件を持つ iOS アプリを作成しています:アプリは、初回起動時にログイン画面を表示する必要があり、また、アプリがバックグラウンドからフォアグラウンドに移動したときにもその画面を表示する必要があります。実行時にバックグラウンドに送信されました。

どちらの場合も画面を表示するように処理しました。ただし、アプリがバックグラウンドから来て、テキストフィールドをクリックしてパスワードを入力すると、アプリがフリーズし、意味がわからないスレッドで失敗します。

appDelegate の applicationWillEnterForeground で、このようにアプリがバックグラウンドから来るときに表示される画面を呼び出します。

self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
RoomRootViewController* room = [[RoomRootViewController alloc] init];
[[self window] setRootViewController:room];
[self.window makeKeyAndVisible];

これは正しい方法ですか?

よろしくお願いします!私はiOSで非常に新しいので、これで完全に迷っています。どんな助けでも大歓迎です。

画像に添付すると、アプリが失敗する場所がわかります。アプリが失敗するスレッドのスクリーンショット

スレッドの問題を解釈するために作成された追跡のスクリーンショット

4

2 に答える 2

8

現在使用しているコードは、アプリ ウィンドウのルート ビュー コントローラーを完全に削除しています。つまり、アプリ内のすべてのビューとビュー コントローラーを削除しています。ARC を使用していない場合、これは 1 つの巨大なメモリ リークにすぎません。もしそうなら、それはまだあまり良い考えではありません。

applicationWillEnterForeground:メソッドでは、代わりに次のコードを使用してみてください。

RoomRootViewController* room = [[RoomRootViewController alloc] init];
[self.window.rootViewController presentViewController:room
                                             animated:NO
                                           completion:nil];

これにより、アプリの現在のビューを削除するのではなく、すべてRoomRootViewController の上に重ねて表示されます。その後、次のように閉じることができます。

[self.window.rootViewController dismissViewControllerAnimated:YES
                                                   completion:nil];

アプリの残りの部分に簡単に戻ることができます。

于 2013-07-10T03:52:14.280 に答える
0

このコード行を使用している場合、非常に面倒です

self.window=[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

これは、毎回他のすべてのコンポーネントUIWindowを含む新しいインスタンスを作成するたびに意味します。UIViewControllerつまり、バックグラウンドに移動してフォアグラウンドに移動すると、古いウィンドウ インスタンスがフラッシュされ、新しいコンポーネントが含まれます。そのため、UITextField をクリックすると割り当てが解除されます。エラーが発生する理由です。ウィンドウの新しいインスタンスを作成せず、@ PartiallyFiniteのようにコードを使用してください。

お役に立てれば。

于 2013-07-10T05:33:56.810 に答える