2009-11-07 11 views
0

J'utilise un geste de secousse pour mon application mais j'ai un problème!Comment empêcher une vue spécifique de répondre aux mouvements de secousse?

Mon application est une application multi-vues et je veux utiliser le geste de secousse sur la vue 2. Si je geste shake actif sur la vue 2, je dois écrire le code ci-dessous dans le MainViewController.m et MyView2Controller.m à utiliser le geste de secousse.

Ensuite, si je secoue l'iphone, afficher l'alerte sur les deux affichages, et je ne veux pas cela. Je veux que l'alerte n'apparaisse que dans la vue 2. Donc, si je désactive le code sur MainViewController.m ou la vue 1, cela ne fonctionne plus dans la vue 2!

Toute aide appréciée!

alt text http://www.freezpic.com/pics/98f1465147344642e3870bb599eba689.jpg

Voici mon code:

-(BOOL)canBecomeFirstResponder { 
    return YES; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self becomeFirstResponder]; 
} 

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 

{ 
    if (event.subtype == UIEventSubtypeMotionShake) 
    { 
     UIAlertView *alet =[[UIAlertView alloc]initWithTitle:nil message:@"Shake shake shake" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alet show]; 
     [alet release]; 
     self.view.backgroundColor = [UIColor orangeColor]; 

    } 
} 
+0

est 'vue 2' une sous-vue de' principal view' ou frères et soeurs? – TechZen

+0

Quel objet est votre délégué 'UIAccelerometer'? – TechZen

Répondre

0

OK je résolu mon problème avec ce code:

#define kAccelerationThreshold  2.2 
#define kUpdateInterval    (1.0f/10.0f) 

@interface info : UIViewController <UIAccelerometerDelegate> { 

} 
@end 

~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~ 

@implementation info 


- (void)viewDidLoad { 
    UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer]; 
    accel.delegate = self; 
    accel.updateInterval = kUpdateInterval; 


    [super viewDidLoad]; 
} 


#pragma mark - 
- (void)accelerometer:(UIAccelerometer *)accelerometer 
     didAccelerate:(UIAcceleration *)acceleration { 
    { 
     if (acceleration.x > kAccelerationThreshold 
      || acceleration.y > kAccelerationThreshold 
      || acceleration.z > kAccelerationThreshold) { 


//What do you want to do ! 

      self.view.backgroundColor = [UIColor orangeColor]; 



     } 
    } 
} 
2

Je suppose que votre code est du contrôleur de vue pour votre deuxième vue (celui que vous voulez répondre au geste de secouer). Dans ce cas, il vous suffit de démissionner le premier statut de répondeur pour ce contrôleur de vue en -viewWillDisappear:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self resignFirstResponder]; 
} 

Le deuxième contrôleur de vue alors cesser de répondre à secouer les gestes.

+0

salut brad! J'ai changé viewDidAppear pour voirWillDisappear et cela n'arrive pas. Voici mon exemple de code pouvez-vous résoudre mon problème? :) S'IL VOUS PLAÎT http://rapidshare.com/files/303744589/ShakeIt.zip.html – Momi

+0

j'ai trouvé quelque chose! mon code fonctionne seulement dans MainviewController (mon appViewController original) et si je n'écris aucun code sur le MyView2Controller.m ou n'importe quels dossiers de viewController ... Alerte seulement montrer avec MainviewController sur n'importe quelle vue! – Momi