2011-09-18 18 views
7

Mam problem z moim widokiem tabeli. Odrzucając kontroler widoku modalnego przedstawiony na górze, zawsze przewija do góry. Próbowałem obserwować zmiany do contentOffset używając KVO, ale ten, który zakłóca mój widok, idzie za tym.dismissModalViewControllerAnimated resetuje contentOffset

Z UITableViewController, gdy użytkownik zakończy swoje zadanie w oknie modalnym, self.tableView.contentOffset jest wzywam:

[self dismissModalViewControllerAnimated:YES] 

Następnie, gdy viewWillAppear:(BOOL)animated się nazywa, self.tableView.contentOffset jest już ustawiony na 0,0.

Czy to ma się stać? Jestem w stanie obejść problem, pamiętając o pozycji przewijania przed przedstawieniem widoku modalnego i przywrócić go z powrotem w viewWillAppear po odrzuceniu widoku modalnego. Ale wydaje się nie tak. Czy czegoś brakuje?

Znalazłem podobny problem opisany w Dismiss modal view changes underlying UIScrollView.

+1

czy można sprawdzić, czy 'viewDidLoad:' zostanie wywołany po odrzuceniu widoku modalnego? (Zauważyłem, że może się to zdarzyć podczas ostrzeżenia o pamięci, niektóre komponenty są rozładowywane, nawet jeśli widok jest pchany). –

+0

babbidi ma dobry punkt, twój widok może zostać rozładowany, podczas gdy widok modalny jest na górze, w przypadku ostrzeżenia o pamięci. Jeśli zainicjujesz widok tabeli w metodzie viewDidLoad, a podczas widoku modalnego pojawi się ostrzeżenie o pamięci, widok tabeli może zostać ponownie zainicjowany po odrzuceniu widoku modalnego. Umieść NSLogs w viewDidUnload i viewDidLoad. – MattyG

+0

Już monitorowałem 'viewDidUnload' - i nie, widok nie jest rozładowywany. – Palimondo

Odpowiedz

5

Wygląda na to, że jest to domyślne zachowanie kontrolki UITableViewController. Przetestowałem to w bardzo prostej aplikacji i działało dokładnie tak, jak powiedziałeś. Jeśli ci się nie podoba, użyj zamiast tego UIViewController.

+0

Dzięki za potwierdzenie mojego podejrzenia. Zacząłem się zastanawiać ;-) – Palimondo

+0

@Split Mam UIViewController, ale nadal ten problem jest powtarzalny – iOSdev

5

Oto jak obejść ten problem, aby widok tabeli zachował oryginalną pozycję przewijania. W moim podklasy UITableViewController Dodałem:

@property (assign) CGPoint lastScrollPosition; 

Następnie w realizacji, mam przesłonięte następujące:

- (void)viewWillAppear:(BOOL)animated 
{ 
    self.tableView.contentOffset = self.lastScrollPosition; 
} 

- (void)dismissModalViewControllerAnimated:(BOOL)animated 
{ 
    self.lastScrollPosition = self.tableView.contentOffset; 
    [super dismissModalViewControllerAnimated:animated]; 
} 

Jeśli chcesz, aby Twój stół początkowo pojawiają przewijane do niezerowej pozycji, jak Zrobiłem, nie zapomnij zainicjować lastScrollPosition w twoim viewDidLoad.

+0

Dzięki Palimondo za wpis. Rozwiązałeś dla mnie dokładny problem! –

Powiązane problemy