Na w tym samouczku autor ma następujące deklaracje:
Na .h
UIViewController *presentingViewController;
...
@property (retain) UIViewController *presentingViewController;
Na .m
@synthesize presentingViewController;
W pewnym momencie kodu, w bloku, robi:
self.presentingViewController = viewController;
I wtedy
[presentingViewController dismissModalViewControllerAnimated:NO];
Uważam to za bardzo dziwne. Jeśli przypisuje viewController do self.presentingViewController, czy nie powinien wywoływać?
[self.presentingViewController dismissModalViewControllerAnimated:NO];
?
Zmieniłem jego kod na
.h
@property (retain) UIViewController *presentingViewController;
.m
@synthesize presentingViewController = _presentingViewController;
A to co robię to:
self.presentingViewController = viewController;
I wtedy
[self.presentingViewController dismissModalViewControllerAnimated:NO];
Problem polega na tym, że self.presentingViewController jest zerowe w tym wierszu, nawet jest zadeklarowane jako zachowane i nigdy nie zostanie wydane.
Jakieś wskazówki?
Dzięki
2 odpowiedzi
Czy usunąłeś zmienną instancji UIViewController *presentingViewController
podczas dodawania zmiennej instancji UIViewController *_presentingViewController
? Jeśli nie, zapłaciłbym na ciebie przypadkowo, używając niewłaściwego w pewnym momencie.
Przechodząc przez… pierwotnie miałeś zmienną instancji
UIViewController *presentingViewController;
A z właściwości cukru składniowego masz dwie metody akcesorów do ustawiania i pobierania zmiennej
- (UIViewController *)presentingViewController;
- (void)setPresentingViewController:(UIViewController *)val;
W pewnym momencie kodu, wewnątrz bloku, robi:
[self setPresentingViewController: viewController]; // uses setter
I wtedy
[presentingViewController dismissModalViewControllerAnimated:NO]; // uses instance variable
Co jest w porządku, ale uważasz, że powinno być
UIViewController *localPresentingViewController = [self presentingViewController]; // uses getter
[localPresentingViewController dismissModalViewControllerAnimated:NO];
Co też jest w porządku, ale trochę niepotrzebne.
Następnie dodałeś nową zmienną instancji:-
@synthesize presentingViewController = _presentingViewController;
Więc teraz masz
UIViewController *presentingViewController;
UIViewController *_presentingViewController;
// These now get / set _presentingViewController
- (UIViewController *)presentingViewController;
- (void)setPresentingViewController:(UIViewController *)val;
Ale prawie na pewno gdzieś mylisz dwie ivary (lub nie wiesz, że masz dwie ivary)presentViewController / _presentingViewController i nadal masz odniesienie do ivarpresentViewController, co prowadzi do wniosku, że twoja właściwość jest zerowa.
Masz rację, że powinno być:
[self.presentingViewController dismissModalViewControllerAnimated:NO];
Jednak przywróć to:
@synthesize presentingViewController;
I usuń dekorację instancji o podobnie wyglądającej zmiennej:
UIViewController *presentingViewController;
Podobne pytania
Nowe pytania
iphone
NIE używaj tego znacznika, chyba że adresujesz konkretnie iPhone'a i / lub iPoda touch firmy Apple. W przypadku pytań niezależnych od sprzętu użyj tagu [ios]. Więcej tagów do rozważenia to [xcode] (ale tylko jeśli pytanie dotyczy samego IDE), [swift], [objective-c] lub [cocoa-touch] (ale nie [cocoa]). Proszę powstrzymać się od pytań dotyczących iTunes App Store lub iTunes Connect. Jeśli używasz języka C #, oznacz tagiem [mono].