2016-09-19 7 views
9

Po migracji mojego kodu do Swift 3. napotkam problem. Domyślam się, że iOS10 podnosi teraz nowe problemy i faktycznie nie jest związany z samym Swift.Swift UIViewReportBrokenSuperview Przyczyna wywołania przez manipulację warstwami

Błąd:

*** 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.' 

Kod wyzwalania problem jest:

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

Kod sub odpowiedzialny za problem wydaje się być:

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

Dlaczego manipulujesz hierarchią warstw? Być może lepiej jest dodać pasek narzędzi, podobnie jak wyglądzie myModelView i na pewno pozbyć się tego problemu? – slashdot

+0

Cóż, jest to starszy kod, więc próbuję naprawić problem tutaj. Na razie właśnie usunąłem problem insertSublayer. Zauważyłem, że to była jakaś sztuczka, aby uzyskać tło przezroczystości. Wygląda na to, że jest to znana sztuczka, ale powoduje awarię aplikacji w nowej. Zaktualizuję ten wpis, gdy tylko skończę. – Mikael

+0

Witam @Mikael "Przerwij UIViewReportBrokenSuperviewChain do debugowania.". Czy wiesz, co to znaczy? Mam ten błąd również i nie jest dobrze udokumentowany. –

Odpowiedz

9

miałem ten problem z biblioteką po przejściu do Xcode 8 (Material-Controls-For-iOS - MDTextField). Odkryłem, że problem wynikał z tego, że warstwa jednego widoku (bez podglądu) była dodawana do drugiej.

Wygląda na to, że tak też może być w przypadku Ciebie - utworzony pasek narzędzi nie został wcześniej dodany do podglądu. Rozwiązaniem, którego użyłem, było dodanie widoku jako podskoku widoku, do którego dodawano warstwę, więc w twoim przypadku dodanie paska narzędzi jako podglądu myModelView powinno zatrzymać błąd.

+0

Wyraźnie znalazłeś przyczynę katastrofy tutaj. jeśli dodam: [self.myModelView addSubview: _toolbar]; przed włożeniem warstwy, bez awarii. – Mikael