2016-02-24 15 views
10

używam techniki dostarczone przez this SO answer wstępnego ładowania jakiś URL w SFSafariViewController takiego:Jak poprawnie usunąć SFSafariViewController jako kontroler widoku podrzędnego?

addChildViewController(svc) 
svc.didMoveToParentViewController(self) 
view.addSubview(svc.view) 

I próbuję wyjąć regulator Safari widok z następującego kodu:

svc.willMoveToParentViewController(nil) 
svc.view.removeFromSuperview() 
svc.removeFromParentViewController() 

Teraz mogę wstępnego załadowania adres URL i pokaż widok Safari bez problemu. Jednak po wielokrotnym powtórzeniu procesu (preload/show/remove) (prawdopodobnie 30+ razy) aplikacja ulegnie awarii z powodu jakiegoś problemu z pamięcią, ponieważ dziennik pokazuje Memory level is not normal or this app was killed by jetsam, gdy aplikacja się zawiesza.

Przed katastrofą, widziałem kilka dzienników o ostrzeżeniach możliwe-wyciek:

<Warning>: notify name "UIKeyboardSpringBoardKeyboardShow" has been registered 20 times - this may be a leak 

<Warning>: notify name "com.apple.SafariViewService-com.apple.uikit.viewService.connectionRequest" has been registered 20 times - this may be a leak 

robię to poprawnie po usunięciu kontrolera Safari View? Czy czegoś brakuje? Lub jakiejkolwiek sugestii, aby obejść ten problem?

Odpowiedz

1

Jeśli dodawanie kodu kontrolera widoku podrzędnego jest takie, jak określono powyżej, uważam, że jego kolejność powinna być nieco inna niż w dokumentacji.

addChildViewController(svc) 
view.addSubview(svc.view) 
svc.didMoveToParentViewController(self) 

Najpierw należy dodać widok potomny, a następnie wywołać didMoveToParentViewController. Spróbuj tego i zobacz, czy to działa.

listingu 5-1Adding kontroler widok dziecko pojemnika

  • (void) displayContentController: Zawartość (UIViewController *) {[siebie addChildViewController: zawartość]; content.view.frame = [self frameForContentController]; [self.view addSubview: self.currentClientView]; [treść didMoveToParentViewController: self]; }

W poprzednim przykładzie zwróć uwagę, że wywołujesz tylko metodę potomną didMoveToParentViewController:. To dlatego, że metoda addChildViewController: wywołuje dla użytkownika metodę dziecka willMoveToParentViewController: child. Powód, dla którego użytkownik musi wywołać metodę didMoveToParentViewController: sam, jest taki, że nie można wywołać tej metody, dopóki nie zostanie osadzony widok dziecka w hierarchii widoku kontenera.

+0

próbował sugerowanej kolejności, ale nadal ten sam problem pozostaje. –

+0

Czy mógłbyś użyć WKWebkitView i dodać go jako podgląd do głównego VC zamiast używać SVC? –

+1

nie, używanie WKWebkitView to zupełnie inna sprawa. –

1

prawdopodobnie wyciekłeś svc. usuń go po usunięciu.

svc.willMoveToParentViewController(nil) 
svc.view.removeFromSuperview() 
svc.removeFromParentViewController() 
svc = nil 

jeśli to nie rozwiązuje go, spróbuj włączyć zombie lub używać instrumentu nieszczelności