2

私は2つのクラスを持っています。A、Bクラスとしましょう。Aクラスから pushviewController を呼び出すと、Bクラスが出現します。次に、問題があります.Bクラスからpopviewcontrolleranimatedメソッドを呼び出すと、Aに戻りますが、両方のクラスのviewwillappearメソッドが呼び出されています。ここで何が起こっているのか誰でも教えてくれます。ハマった!。下はAクラス。

@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

Bクラスはこちら

@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
4

1 に答える 1

0

それは正常です。View will appear は、ビューが表示されるたびに呼び出されます。ビューが初めて表示されたときにのみメソッドを呼び出したい場合は、-viewdidload を使用します。ビュー コントローラーでは、スタック内の各ビューはメモリ内に保持されますが、ポップしたビューは割り当てが解除されるためです。

于 2012-07-27T08:06:21.230 に答える