関数を呼び出して異なるストーリーボード間を移動するドロップダウン メニューを iOS アプリに実装しました。そのメニューの各要素は、別のストーリーボード名で AppDelegate クラスの次の関数を呼び出します。
(void)changeController:(NSString*)storyboardName
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:[NSBundle mainBundle]];
//initialize the new view
currentView = [storyboard instantiateInitialViewController];
currentView.view.alpha = 0.0;
currentView.view.frame = currentView.view.bounds;
currentView.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
//the app crashes on this line with a Thread 1: signal SIGARBT message
self.window.rootViewController = currentView;
[self.window makeKeyAndVisible];
//animate with a fade transition
[UIView animateWithDuration:transitionDuration
delay:0.0
options:UIViewAnimationOptionCurveLinear
animations:^{currentView.view.alpha = 1.0;}
completion:^(BOOL finished){}];
}
問題は、呼び出される関数が一貫性なくアプリをクラッシュさせることです。一部の画面では機能し、他の画面では機能しません。さらに悪いことに、通常はクラッシュする画面でも機能することがあります。
コンソールにダンプされる 2 つのエラー メッセージがあり、それらは (読みやすくするために改行を追加しました)。
Objective: {
objective 0x15e4b3c0: <750:-1.64135e-05> + <750:8.34465e-08>
*<orphaned without delegate (bug!):0x1703c790>{id: 188} + <750:4.17233e-08>
*<orphaned without delegate (bug!):0x1703c980>{id: 192} + <750:-2.68221e-08>
*UIView:0x170c6e40.Height{id: 1091}
}
と
uncaught exception: <NSISEngine: 0x15e0b380>{ Rows:
UIWindow:0x15db3160.Height{id: 140} == 960 + 1*0x15dd03e0.marker{id: 144}
UIWindow:0x15db3160.Width{id: 137} == 640 + 1*0x15dd03b0.marker{id: 141}
UIWindow:0x15db3160.minX{id: 136} == 0 + 2*0x15dd0200.marker{id: 135} + -0.5*0x15dd03b0.marker{id: 141}
UIWindow:0x15db3160.minY{id: 139} == 0 + 2*0x15dd0350.marker{id: 138} + -0.5*0x15dd03e0.marker{id: 144}
objective{id: 1} == {
objective 0x15e4b3c0: <750:-1.64135e-05> + <750:8.34465e-08>
*<orphaned without delegate (bug!):0x1703c790>{id: 188} + <750:4.17233e-08>
*<orphaned without delegate (bug!):0x1703c980>{id: 192} + <750:-2.68221e-08>
*UIView:0x170c6e40.Height{id: 1091}}
Constraints:
<NSAutoresizingMaskLayoutConstraint:0x15dd03b0 h=--- v=--- H:[UIWindow:0x15db3160(320)]> Marker:0x15dd03b0.marker{id: 141}
<NSAutoresizingMaskLayoutConstraint:0x15dd03e0 h=--- v=--- V:[UIWindow:0x15db3160(480)]> Marker:0x15dd03e0.marker{id: 144}
<_UIWindowAnchoringConstraint:0x15dd0200 h=--- v=--- UIWindow:0x15db3160.midX == + 160> Marker:0x15dd0200.marker{id: 135}
<_UIWindowAnchoringConstraint:0x15dd0350 h=--- v=--- UIWindow:0x15db3160.midY == + 240> Marker:0x15dd0350.marker{id: 138}
Integralization Adjustments:
(none)
Statistics:
4 rows. Variable counts:
1 -> 2
2 -> 2
}: internal error. Cannot find an outgoing row head for incoming head UIView:0x170c6e40.Height{id: 1091}, which should never happen.
私を本当に混乱させるのは、「内部エラー....これは決して起こらないはずです」という最後の行です。
他の誰かがこのエラーに遭遇したかどうか、そして彼らがどのように対処したかが気になります。
これは、変数 currentView の初期化の問題ですか、それとも AppDelegate のウィンドウ変数と関係があるのでしょうか?
これは本当にストーリーボードの制約の問題ですか? その場合、1 つの画面に配置できる/配置する必要がある制約の数に制限はありますか?
編集:
エラーは、特定のストーリーボードから離れたときにのみ発生したことがわかりました。画面上の制約がエラーをスローしていました。そのため、changeController にいくつかのコードを追加しました。プログラムによってすべてのサブビューから制約を削除し、スーパービューからすべてのサブビューを削除します。
問題のある UIViewController の制約がクリアされ、再作成されたときに、問題は最終的に解決されました。
ご協力とご提案をありがとうございます。