popViewControllerAnimated засяга viewwillappear?

Имам два класа. да речем A, B класове. от клас A се извиква pushviewController, след което ще се появи клас B. Тогава тук е проблемът. Когато извикам popviewcontrolleranimated метод от клас B, той се връща към A, но след това се извиква методът viewwillappear на двата класа. така че всеки може да ми каже какво става тук. в безисходица съм!. По-долу е клас А.

@implementation ShakeViewController

- (id) init {
if (self = [super init]) {
    movieName = @"04";
    self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
    [self.view setBackgroundColor:[UIColor whiteColor]];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"shake_it.png"]];
    [self.view addSubview:imageView];
    [imageView release];
    nextController = [[OtsugeViewController alloc] init];
}    
return self;
} 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
const float violence = 1.2;
static BOOL beenhere;
BOOL shake = FALSE;

if (beenhere) return;
beenhere = TRUE;

if (acceleration.x > violence || acceleration.x < (-1* violence))
    shake = TRUE;
if (acceleration.y > violence || acceleration.y < (-1* violence))
    shake = TRUE;
if (acceleration.z > violence || acceleration.z < (-1* violence))
    shake = TRUE;
if (shake && mPlayerPushed) {
    [self playSound:@"suzu"];

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"noVib"] == NO) {
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    }

    [[UIAccelerometer sharedAccelerometer] setDelegate:nil];
    [self presentModalViewController:mMoviePlayer animated:YES];
    [self play];
    mPlayerPushed = YES;
}

beenhere = false;
}

- (void)toNext {
NSLog(@"ShakeViewController:toNext");
[self.navigationController pushViewController:nextController animated:NO];
}

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"Shake:viewWillAppear");
}

- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.5];
}

- (void)dealloc {
[super dealloc];
}

@end

тук е Б клас

@implementation OtsugeViewController

- (id) init {
if (self = [super init]) {
    movieName = @"03";
    self.view = [[[OtsugeView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
}
return self;
}

- (void) toNext {
NSLog(@"OtsugeViewController:toNext");
[self.navigationController popViewControllerAnimated:NO];
}

- (void) toToppage
{
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];        

[self.navigationController popToRootViewControllerAnimated:NO];
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"Screen touch Otsuge View");
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                          delegate:self 
                                                        cancelButtonTitle:@"Cancel"  destructiveButtonTitle:nil
                                                otherButtonTitles:@"Retry", @"Main Menu", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;

actionSheet.cancelButtonIndex = 0;
[actionSheet showInView:self.view]; 
[actionSheet release];
}

- (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex: (NSInteger)buttonIndex
{
switch (buttonIndex) {
    case 0: // Retry
        [self presentModalViewController:mMoviePlayer animated:YES];
        [self play];
        break;
    case 1: // Main Menu
        [self toToppage];
        break;
    case 2: // Cancel
        break;
    default:
        break;
}
}

- (void) viewWillAppear:(BOOL)animated {
mMoviePlayer.moviePlayer.backgroundView.backgroundColor = [UIColor blackColor];
[self playSound:@"taiko_1"];
NSLog(@"Otsuge:viewWillAppear");
[(OtsugeView *)self.view renewImageView];

[super viewWillAppear:animated];
}

- (void) viewDidAppear:(BOOL)animated{
NSLog(@"Otsuge:viewDidAppear");
[super viewDidAppear:animated];
}

- (void) dealloc {
[super dealloc];
}

@end

person Mungunbat Enkhbayar    schedule 27.07.2012    source източник
comment
искаш да кажеш, че viewWillAppear от клас B се извиква след извършване на изскачане от клас B към клас A? извиква ли се и клас B viewWillDisappear?   -  person sergio    schedule 27.07.2012
comment
да viewwillappear се извиква след извършване на pop. Не промених нищо относно viewwilldisappear, така че е по подразбиране.   -  person Mungunbat Enkhbayar    schedule 27.07.2012


Отговори (1)


Нормално е. Изгледът ще се появи се извиква всеки път, когато се появи изглед. Ако искате да извикате метод само когато изгледът се появи за първи път, използвайте -viewdidload, защото в контролера на изглед всеки изглед, който е в стека, се съхранява в паметта, но тези, които изскачате, се освобождават.

person Nicolas Manzini    schedule 27.07.2012