Existe-t-il un moyen de demander un point de vue iOS lequel de ses enfants a le statut de premier répondeur? [dupliquer

StackOverflow https://stackoverflow.com/questions/5029267

Question

Cette question a déjà une réponse ici:

Dans Mac OS X, vous pouvez trouver le premier intervenant comme ceci:

[[self window] firstResponder]

Y a-t-il un moyen de le faire dans iOS? Ou avez-vous besoin d'énumérer les contrôles de l'enfant et d'envoyer un isFirstResponderMessage à chacun?

Était-ce utile?

La solution

Vous auriez besoin d'itérer sur tous les contrôles de l'enfant et de tester le isFirstResponder propriété. Lorsque vous rencontrez TRUE, Sortez de la boucle.

UIView *firstResponder;
for (UIView *view in self.view.subviews) //: caused error
{
    if (view.isFirstResponder)
    {
        firstResponder = view;
        break;
    }
}

Meilleure solution

Voir La réponse de Jakob.

Autres conseils

J'aime vraiment Solution de VJK, mais comme Mattdipasquale le suggère, il semble plus complexe que nécessaire. J'ai donc écrit cette version plus simple:

Objectif c

#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

Swift 4

import UIKit

extension UIResponder {

    private static weak var _currentFirstResponder: UIResponder?

    static var currentFirstResponder: UIResponder? {
        _currentFirstResponder = nil
        UIApplication.shared.sendAction(#selector(UIResponder.findFirstResponder(_:)), to: nil, from: nil, for: nil)

        return _currentFirstResponder
    }

    @objc func findFirstResponder(_ sender: Any) {
        UIResponder._currentFirstResponder = self
    }
}

J'en ai également fait une méthode de classe car cela semblait avoir plus de sens. Vous pouvez maintenant trouver le premier répondeur comme: [UIResponder currentFirstResponder]


J'ai écrit une catégorie sur UIResponder pour trouver le premier répondeur

@interface UIResponder (firstResponder)
- (id) currentFirstResponder;
@end

et

#import <objc/runtime.h>
#import "UIResponder+firstResponder.h"

static char const * const aKey = "first";

@implementation UIResponder (firstResponder)

- (id) currentFirstResponder {
    [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:self forEvent:nil];
    id obj = objc_getAssociatedObject (self, aKey);
    objc_setAssociatedObject (self, aKey, nil, OBJC_ASSOCIATION_ASSIGN);
    return obj;
}

- (void) setCurrentFirstResponder:(id) aResponder {
    objc_setAssociatedObject (self, aKey, aResponder, OBJC_ASSOCIATION_ASSIGN);
}

- (void) findFirstResponder:(id) sender {
    [sender setCurrentFirstResponder:self];
}

@end

Puis dans n'importe quelle classe qui dérive d'un UIResponder Vous pouvez obtenir le premier intervenant en appelant

UIResponder* aFirstResponder = [self currentFirstResponder];

Mais n'oubliez pas d'importer d'abord le fichier d'interface de la catégorie UIResponder!

Cela utilise des API documentées, il ne devrait donc y avoir aucun problème de rejet de l'App Store.

Si vous avez besoin de premier répondeur juste pour lui demander de démissionner de son statut, voici une approche pour obtenir n'importe laquelle démissionner. UIView a une méthode qui iratera dans tous les sous-vues UIViews et demandera à celle qui est d'abord répondant à démissionner.

[[self view] endEditing:YES];

Voici une lien vers les documents UIView d'Apple"Cette méthode examine la vue actuelle et sa hiérarchie sous-vue pour le champ de texte qui est actuellement le premier répondeur. S'il en trouve un, il demande à ce champ de texte de démissionner en tant que premier répondeur. Si le paramètre de force est défini sur oui, le texte Le champ n'est même jamais demandé; il est obligé de démissionner. "

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top