widok Pojemnik kontroler "nie automatycznie zapisywać odniesień do jakichkolwiek zawierał kontrolerów widoku dziecko. Jeśli wdrożenie kontrolera widoku niestandardowym pojemnik, należy zakodować sterownik widok dziecko sprzeciwia się, jeśli chcesz, żeby być zachowane”
Istnieją proste zasady, które znalazłem.
1.Embedded (dziecko) kontroler widoku powinien już być utworzony i dodany do nadrzędnego kontrolera widoku w procesie konserwacji stanu.Tak więc nie musisz nic robić, jeśli używasz storyboardu, w przeciwnym razie będziesz musiał utworzyć instancję kontrolera widoku podrzędnego i dodać go ręcznie:
-(void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Did load");
MyChildViewController *childViewController = [MyChildViewController new];
[self addChildViewController:childViewController];
[childViewController didMoveToParentViewController:self];
self.childVC = childViewController;
}
Możesz dodać widok dziecka pod -viewDidLoad
o r później. Użyj do tego celu self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view];
.
2.You bez konieczności ratowania kontroler widoku dziecko rodzica -encodeRestorableStateWithCoder:
siebie, ale trzeba kodować odniesienie do tego obiektu za pomocą -encodeObject:forKey:
. Jeśli masz odniesienie można zrobić to tak:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Encode");
UIViewController *childViewController = self.childVC;
[coder encodeObject:childViewController forKey:@"ChildVC"];
[super encodeRestorableStateWithCoder:coder];
}
zobaczyć https://stackoverflow.com/a/13279703/2492707 aby uzyskać odwołanie do dziecięcej VC jeśli używasz Storyboard. Czy można napisać coś prostego tak:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Encode");
UIViewController *childViewController = [self.childViewControllers objectAtIndex:0]; //[self.childViewControllers lastObject];
[coder encodeObject:childViewController forKey:@"ChildVC"];
[super encodeRestorableStateWithCoder:coder];
}
3. wbudowania (dziecko) Widok kontroler powinien być już utworzony i dodany do widoku nadrzędnego regulatora w procesie przywracania stanu. Tak więc, jeśli zrobiłeś wszystko w pierwszym akapicie, nie ma tu nic więcej do zrobienia.
4. "Jednak w tym przypadku nie dekoduję kontrolera widoku podrzędnego: możemy może, ale w rzeczywistości nie potrzebujemy go.Obiekt MyChildViewController przywróci własny stan. Mamy tylko zakodowane to odniesienie w celu uzyskania runtime chodzić łańcuch do instancji MyChildViewController i oszczędzają i-przywrócić na nim”.
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Decode");
[super decodeRestorableStateWithCoder:coder];
}
This książka pomaga mi do zrozumienia zachowania stanu z widokiem kontenerowych. również look za dobry przykład dla tej książki
Czy dodać dziecka do rodzica z addChildViewController: – jsd
tak nazywasz didMoveToParentViewController: metodę po dodaniu kontrolera widoku dziecko do kontrolera widoku rodzica – HermioneGreen
widok pojemnik powinien Robię to automatycznie. Otrzymuję odwołanie do niego od rodziców childViewControllers. –