2016-09-19 9 views
9

コードをSwift 3に移行した後に問題が発生しました。 iOS10で新しい問題が発生していると思いますが、実際はSwift自体には関係ありません。レイヤー操作によるSwift UIViewReportBrokenSuperviewChainの理由

エラー:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'View has lost track of its superview, most likely through unsupported use of CALayer API on the view's layer. If this isn't a crash yet, it will be in the near future. 
    Problem view: <UIToolbar: 0x102552d80; frame = (0 0; 375 683); alpha = 0.97; opaque = NO; layer = <CALayer: 0x1700383e0>> 
    Expected parent: <MyModelView: 0x10250ecd0; frame = (0 -16; 375 683); hidden = YES; layer = <CALayer: 0x17003d4a0>> 
Break on UIViewReportBrokenSuperviewChain to debug.' 

問題をトリガーするコードは次のとおりです。

[c presentViewController:tabBarViewController animated:NO completion:^{ 

問題を担当するサブコードがあると思われる:

- (void)addBlurView 
{ 
    CGRect viewBounds = [[UIScreen mainScreen]applicationFrame]; 
    self.myModelView = [[MyModalView alloc] initWithFrame:CGRectMake(viewBounds.origin.x, -16, viewBounds.size.width, viewBounds.size.height+36)]; 

    if(![self toolbar]) { 
    _toolbar = [[UIToolbar alloc] initWithFrame:[self.myModelView bounds]]; 
    [_toolbar setBarStyle:UIBarStyleBlack]; 
    _toolbar.alpha = 0.97; 
    [self.myModelView.layer insertSublayer:_toolbar.layer atIndex:0]; 
    } 

    [self.view addSubview:self.myModelView]; 
} 
+0

なぜレイヤー階層を操作していますか?多分、myModelViewのサブビューとしてツールバーを追加し、この問題を確実に取り除く方が良いでしょうか? – slashdot

+0

これはレガシーコードなので、ここで問題を解決しようとしています。今のところ私はinsertSublayerの問題を削除しました。私はそれが透明性の背景を得るための何らかのトリックであることを発見しました。明らかにそれは既知のトリックだが、それは新しいものでアプリクラッシュを引き起こす。私はそれを終えるとすぐにこの投稿を更新します。 – Mikael

+0

こんにちは@Mikael "デバッグするためにUIViewReportBrokenSuperviewChainを中断してください。"これは何を意味するのですか?私もこのエラーがあり、それは十分に文書化されていません。 –

答えて

9

私はこの問題を持っていましたライブラリを使用してXcode 8(Material-Controls-for-iOS-MDTextField)に移動します。私は、問題が、(スーパービューを持たない)1つのビューのレイヤーが別のレイヤーに追加されていた場所から来ていることを発見しました。

あなたのツールバーがスーパービューに最初に追加されていないこともあります。私が使用した修正は、レイヤーが追加されているビューのサブビューとしてビューを追加することでした。したがって、myModelViewのサブビューとしてツールバーを追加すると、エラーが停止するはずです。

+0

あなたはクラッシュの原因をはっきりと見つけました。私が追加した場合:[self.myModelView addSubview:_toolbar];レイヤーを挿入する前にクラッシュすることはありません。 – Mikael

関連する問題