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

0
Duck 25 luty 2012, 13:55

2 odpowiedzi

Najlepsza odpowiedź

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.

0
hooleyhoop 25 luty 2012, 15:01

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;
0
kamprath 25 luty 2012, 14:34