361 votes

Obtenir le premier intervenant actuel sans l’aide d’une API privée

J'ai soumis mon application un peu plus d'une semaine et a obtenu le rejet redouté e-mail aujourd'hui. Il me dit que mon application ne peut pas être accepté parce que je suis en utilisant un non-API publique; en particulier, dit-il,

Le non-public de l'API qui est inclus dans votre application est firstResponder.

Maintenant, la délinquance appel de l'API est en fait une solution que j'ai trouvé ici sur DONC:

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView   *firstResponder = [keyWindow performSelector:@selector(firstResponder)];

Comment puis-je obtenir de l'actuel premier intervenant sur l'écran? Je suis à la recherche de façon à ne pas obtenir mon app rejeté.

533voto

cdyson37 Points 4284

Si votre but ultime est simplement de démissionner le premier intervenant, cela devrait fonctionner :``

359voto

Thomas Müller Points 7712

Dans l’une de mes applications, je veux souvent le premier intervenant de démissionner si l’utilisateur clique sur le fond. Pour cela, j’ai écrit une catégorie sur UIView, que j’appelle sur le UIWindow.

Ce qui suit est basé sur celui et doit retourner le premier intervenant.

iOS 7 +

195voto

nevyn Points 1796

Une façon courante de la manipulation que le premier intervenant est d'utiliser néant actions ciblées. C'est un moyen de l'envoi d'un arbitraire message sur le répondeur de la chaîne (en commençant par le premier intervenant), et en continuant le long de la chaîne jusqu'à ce que quelqu'un répond au message (a mis en œuvre une méthode correspondant au sélecteur).

Pour le cas de renvoyer le clavier, c'est la manière la plus efficace qui permettra de travailler de n'importe quelle fenêtre ou de la vue est de premier répondant:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

Cela devrait être plus efficace que le même [self.view.window endEditing:YES].

(Merci à BigZaphod pour me rappeler le concept)

109voto

Jakob Egger Points 4282

Voici une catégorie qui permet de trouver rapidement le premier intervenant en appelant [UIResponder currentFirstResponder]. Il suffit d'ajouter les deux fichiers suivants à votre projet:

UIResponder+FirstResponder.h

#import <Cocoa/Cocoa.h>
@interface UIResponder (FirstResponder)
    +(id)currentFirstResponder;
@end

UIResponder+FirstResponder.m

#import "UIResponder+FirstResponder.h"
static __weak id currentFirstResponder;
@implementation UIResponder (FirstResponder)
    +(id)currentFirstResponder {
         currentFirstResponder = nil;
         [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil];
         return currentFirstResponder;
    }
    -(void)findFirstResponder:(id)sender {
        currentFirstResponder = self;
    }
@end

L'astuce ici est que l'envoi d'une action à néant l'envoie au premier intervenant.

(J'ai d'abord publié cette réponse ici: http://stackoverflow.com/a/14135456/322427)

29voto

cannyboy Points 8747

Il n’est pas assez, mais la façon dont j’abandonne le firstResponder quand je ne sais pas ce que le répondeur est :

Créer un UITextField, IB ou par programme. Rendre invisible. Liez-le à votre code si vous l’avez fait à l’IB.

Ensuite, lorsque vous souhaitez rejeter le clavier, vous basculez le répondeur au champ de texte invisible et immédiatement démissionner il :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X