Napisałem prostą aplikację opartą na UINavigationController z dwoma ViewControllers;
W pierwszym kontrolerze widoku mam ten kod
-(IBAction)loadSecondView
{
SecondView *secondView = [[SecondView alloc]init];
[secondView setTotal:self.total];
[self.navigationController pushViewController:secondView animated:YES];
[secondView release];
[self.navigationController popViewControllerAnimated:YES];
}
W drugim widoku mam etykietę stworzoną programowo.
.....
[self.playerNameField addTarget:self
action:@selector(textFieldFinished:)
.....
- (IBAction)textFieldFinished:(id)sender
{
[sender resignFirstResponder];
}
Problem polega na tym, że po dotknięciu przycisku klawiatury dochodzi do awarii aplikacji.
[SecondView performSelector:withObject:]: message sent to deallocated instance 0x522af60
Rozumiem, na czym polega problem, ale nie mogę zrozumieć, dlaczego tak się dzieje.
Popraw mnie, jeśli się mylę.
SecondView *secondView = [[SecondView alloc]init]; // retain 1
[self.navigationController pushViewController:playersNames animated:YES]; //secondView have retain of 2
[secondView release]; // now secondView should have retain of 1
2 odpowiedzi
Dlaczego naciskasz, a potem wyskakujesz kontroler nawigacyjny, po naciśnięciu widok powinien się przełączyć i powinien pojawić się kontroler PlayerName z jego widokiem.
Nie jest też dla mnie jasne, dlaczego otrzymujesz instancję secondView, ale nigdy jej nie używaj. Pchnięcie na NavigationController powinno zachować kontroler, ale wydaje się, że SecondView nigdy nie zostanie zachowane, a kiedy go użyjesz, poprzedni kontroler go zwolnił.
Nie rozumiem tego:
SecondView *secondView = [[SecondView alloc]init];
[self.navigationController pushViewController:playersNames animated:YES];
[secondView release];
Czy próbujesz dodać secondView do nawigatora? byłoby tak:
SecondView *secondView = [[SecondView alloc]init];
[self.navigationController pushViewController:secondView animated:YES];
[secondView release];
Podobne pytania
Nowe pytania
objective-c
Tego znacznika należy używać tylko w przypadku pytań dotyczących funkcji Objective-C lub zależnych od kodu w języku. Tagi [cocoa] i [cocoa-touch] powinny być używane, aby zapytać o ramy lub klasy Apple. Użyj powiązanych tagów [ios], [macos], [apple-watch] i [tvos] w przypadku problemów specyficznych dla tych platform.