2009-11-13 6 views
0

Je dois déplacer les éléments de l'interface utilisateur de mon contrôleur de vue lorsque le clavier apparaît. Je le fais en vous inscrivant aux notifications de clavier dans mon délégué app:iPhone SDK: gestion de l'apparence des keybaord

[[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:observer 
             selector:@selector(keyboardWasHidden:) 
              name:UIKeyboardDidHideNotification object:nil]; 

et la manipulation puis notification comme prescrit par Apple (je code similaire pour le clavier a été montré) pour faire défiler la vue vers le haut et vers le bas:

- (void)keyboardWasHidden:(NSNotification*)aNotification { CGRect viewFrame = [self.view frame]; viewFrame.origin.y += keyboardSize.height - TOOLBAR_HEIGHT; self.view.frame = viewFrame; }

jusqu'à présent, si bon. Description Maintenant problème:

Lorsque j'exécute ce code pour afficher OS 3.0 UI de message spécifique:

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; [self presentModalViewController:picker animated:YES];

et lorsque le clavier affiche dans l'interface utilisateur de messagerie réelle, je reçois toujours la notification du clavier qui défile mon voir et donc briser mon interface utilisateur (notez que le contrôleur de messagerie prend tout l'écran et ma vue n'est même pas visible à ce stade).

J'espérais notification du clavier désactiver temporairement, de sorte que mon code de défilement ne s'appelle cette ligne:

[[NSNotificationCenter defaultCenter] removeObserver:self];

Mais il ne permet pas, le clavier se même encore affiché.

Que dois-je faire pour éviter de réagir sur le clavier lorsqu'il a été créé par l'interface utilisateur du message?

Répondre

1

Ajouter une variable de propriété BOOL ou une instance. careAboutKeyboard qui est accessible à la fois vos méthodes keyboardWasShown: et keywardWasHidden:, probablement dans le contrôleur de vue ces méthodes sont

l'avez mis à YES quand dans la méthode viewWillAppear et définir à NO lorsque vous affichez le courrier et au viewWillDisappear.

Mettez ensuite toutes de votre logique de défilement dans un bloc si:

if(careAboutKeyboard) { 
    // Scrolling logic 
} 
+0

grand esprit pensent de même! Après avoir posté ceci, je pensais que cet apporach serait quelque chose à essayer. Pourriez-vous préciser ce qu'est une propriété "atomique"? Je pensais juste ajouter BOOL variable à la classe, même pas une propriété. – leon

+0

Si votre application est mono-thread, vous n'avez pas à vous soucier de l'atomicité. En fait, puisque seul le thread d'événement devrait appeler les méthodes que j'ai nommées, oubliez que j'ai même dit atomique. J'ai édité ma réponse. –