2010-02-25 27 views
0

J'essaie de détecter un tremblement sur le périphérique iPhone, donc pour ce que j'ai lu, je dois définir mon contrôleur de vue en tant que premier répondeur sur la méthode viewDidAppear . Cette méthode est supposée être appelée automatiquement, mais pour une raison quelconque, cette méthode n'est jamais appelée. Seul viewDidLoad est appelé.Problème avec l'iPhone secoue: viewDidAppear n'est pas appelé lors du chargement de viewController

ceci est mon code (je mets seulement les parties pertinentes):

BuildHouseViewController.h:

@interface BuildHouseViewController: UIViewController {

BuildHouseViewController.m:

- (void)viewDidLoad { 
[super viewDidLoad]; 
[self.view becomeFirstResponder];} 

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

-(BOOL)canBecomeFirstResponder { 
return YES;} 
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{ 

NSLog(@"shake"); 
if (event.subtype == UIEventSubtypeMotionShake) 
{ } 

if ([super respondsToSelector:@selector(motionEnded:withEvent:)]) 
    [super motionEnded:motion withEvent:event]; 
} 

J'ai ajouté des points d'arrêt sur la méthode viewDidAppear et il n'est jamais appelé. Les secousses ne sont jamais détectées, je suppose que c'est parce que comme ces méthodes ne sont jamais appelées, le contrôleur de vue ne peut jamais devenir le premier répondeur. Je ne comprends pas pourquoi cela arrive.

Toute aide sera appréciée.

Edit:

J'appelle le point de vue d'une autre vue à l'aide:

[self.view addSubview:nextScreen.view]; 

La vue est affiché sur l'écran

+0

Afficher le code (ajouter à la question) où BuildHouseViewController est créé et affiché. – DyingCactus

Répondre

1

Merci pour les réponses rapides.

J'ai trouvé quelque chose d'intéressant. J'ai essayé de charger le même point de vue que je vais avoir des problèmes avec de différentes façons et j'obtenir des résultats différents

-Comme je l'ai dit, si je l'appelle d'une autre vue à l'aide:

[self.view addSubview:nextScreen.view]; 

viewDidLoad est jamais appelé et je ne peux pas détecter les secousses.

-Maintenant si je l'appelle de la AppDelegate en utilisant:

[window addSubview:nextScreen.view]; 

viewDidLoad est appelé !! et je suis en mesure de détecter shakes, mais cette solution est impossible, je devrais pouvoir l'appeler d'une autre vue

-Si je l'appelle d'une autre vue à l'aide:

[self presentModalViewController:nextScreen animated:YES]; 

viewDidLoad est appelé! !Cependant, je ne veux pas utiliser un contrôleur de vue modale, mais il semble être la seule solution à mon problème, les secousses sont détectées.

Il est étrange que la première méthode ne se charge pas correctement la vue, est-ce un bug ??

0

Le [auto becomeFirstResponder] et autres ne font pas réellement que devenir le premier intervenant. La méthode est appelée lorsque la vue devient le premier répondeur. Donc ça ne fait pas ce que tu penses.

Deuxièmement, viewDidAppear ne sera appelée que lorsque la vue apparaîtra. Apparaît-il sur l'écran? Où dites-vous qu'il soit affiché? Vous devez soit ajouter la vue du contrôleur de vue en tant que sous-vue d'une autre vue, soit la pousser dans une pile de contrôleurs de navigation, soit la pousser en mode modal.

+0

la vue est affichée à l'écran – fede

+0

Voir: http://stackoverflow.com/questions/1111150/uiwindow-and-uiview-addsubview-question – Bearddo

+0

Selon la documentation de UIResponder becomeFirstResponder: "Vous pouvez appeler cette méthode pour faire un objet répondeur comme une vue le premier répondeur Cependant, vous ne devriez l'appeler sur ce point de vue si elle fait partie d'une hiérarchie de vue Si la propriété de la fenêtre de la vue est titulaire d'un objet UIWindow, il a été installé dans une hiérarchie de vue;.. si elle renvoie zéro, la vue est détachée de toute hiérarchie. " Il semble donc que cela devrait en fait faire du receveur le premier intervenant. –

0

viewDidAppear: (BOOL) n'animée est appelée lorsque la vue est représentée par UINavigationController ou UITabBarController. Si vous ajoutez un point de vue du contrôleur de vue d'une sous-vue (comme un scrollview ou ce que vous avez), il ne sera pas appelé. Vous penseriez que ce serait le cas, mais vous auriez tort. Je me suis juste fait avoir par moi-même.

0

Suite à @ commentaires de Genericrich, vous pouvez appeler manuellement viewDidAppear après avoir mis la sous-vue en vous-même.

[self.view addSubview:theViewController.view]; 
[theViewController viewDidAppear:FALSE]; 

Cela a fonctionné pour moi. J'espère que ça aide quelqu'un d'autre.