私の古いアプリの1つがiOS8で動作していません。アプリを起動し、画面のどこかをタップしようとすると、コンソールに次のメッセージが表示されます。
unexpected nil window in _UIApplicationHandleEventFromQueueEvent,
_windowServerHitTestWindow: <UIWindow: 0x7fe4d3e52660; frame = (0 0; 320 568);
opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7fe4d3e2c450>;
layer = <UIWindowLayer: 0x7fe4d3e86a10>>
古いスタイルのMainWindow.xibを使用しています。 MainWindow.xibには、私のWindowオブジェクトと、最初のView Controllerも定義されているUINavigationControllerがあります。以下の画像は、アプリデリゲートに接続されたアウトレットを示しています。
下のスクリーンショットの白い「ビュー」はUIWindowです。右側のビューはUINavigationController(ナビゲーションバーは非表示)で、最初のViewControllerが内部に定義されています。
新しいプロジェクトでアプリ全体をゼロから再作成せずにこれを修正するにはどうすればよいですか?
編集:私はちょうど私のボタンが実際にタップ/クリックを受け取る小さなストリップがあることを発見しました。
また、self.view.windowがゼロであることにも気付きました。設定されていることを確認するにはどうすればよいですか?
B H回答に追加。 この答え もご覧ください。
横向きのみのアプリを縦向きから起動するときにこの問題が発生しました(また、ホームボタンを2回押すと表示される最近開いたアプリのリストにアプリを表示しないでください。おそらく、iOSは何らかの方法で向きとウィンドウサイズをキャッシュします)。
私のコードは
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];
W+H
ウィンドウの自動サイズ変更マスク、ウィンドウは回転時にサイズ変更されないため、助けにはなりませんでしたが、transform
マトリックスは変更されます。
解決策は簡単です
self.window = [UIWindow new];
[self.window makeKeyAndVisible];
self.window.frame = [[UIScreen mainScreen] bounds];
したがって、ウィンドウはルートビューコントローラから方向を取得した後にフレームが設定されます。
これを修正するためにコードを追加する必要はありません。
メインのxibファイルを開き、左側から「ウィンドウ」を見つけてVisible at Launch
およびFull Screen at launch
。
Window nibファイルをチェックして、フルスクリーンが表示されていることを確認してください。私のアプリでも、右側のストリップにタッチイベントが登録されないという同様の問題がありました。 MainWindow.xibを設定してフルスクリーンを表示すると、エラーがなくなり、タッチイベントが再び機能しました。私のアプリも横に表示されていましたが、MainWindow.xibには縦のサイズがありました。
いくつかの値が欠落している単純な設定である場合があります:Project(プロジェクトに名前を付けたものは何でも)名前項目をクリックし、Generalタブが選択されていることを確認し、一番下までスクロールします。 アプリのアイコンと起動画像起動画面ファイルフィールドに値があることを確認します。これはMainまたはLaunchScreen
のいずれかでなければなりません
誰かがこれが便利だと思う場合:
私の場合、私は使用していました
self.window = [[UIWindow alloc] init];
の代わりに
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
それが問題の理由でした。
[email protected]起動画面のない古いアプリでこのエラーが発生していました。背の高いiPhoneが最初に導入されたとき、これはアプリが新しいジオメトリを処理できるというiOSへのシグナルでした。それ以外の場合は、320x480ウィンドウに表示されました。おかしい、私はアプリがフルスクリーンを使用していないことに気付かなかった。
同じ問題があり、このスレッドで提案された解決策を試してみましたが成功しませんでした。
最終的に私たちのために働いたのは、xibを使用するのではなく、プログラム的に純粋になるようにロジックを書き直すことでした。この後、「unexpected nil window」エラーは表示されず、ビューは画面全体にヒットします。
古いプロジェクトもiOS 7とiOS 8にアップグレードしています。実際、MainWindow.xibは使用しませんが、application:didFinishLaunchingWithOptions:
でwindow
を手動で作成します。
しかし、起動後に同じunexpected nil window in _UIApplicationHandleEventFromQueueEvent
エラーが発生します。
したがって、私の場合、展開ターゲットを6.0
に変更し、main.m
のコードを置き換えることで問題を解決しました。
古いmain.m:
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
新しいmain.m:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([YourAppDelegate class]));
}
}
efpies
ソリューションをテストすることはできませんでしたが、アプリで修正した方法は、MainWindow.xibをStoryboardに置き換えることでした。
これがここでつまずく人を助ける場合、ウィンドウのフレームを設定するときにUIScreen.mainScreen().bounds
サイズを反転させたときにもこのエラーが発生しました。