[ios] objectif c comment définir une touche exclusive pour tous les boutons UI sur l'ensemble de l'application


1 Answers

Si vous voulez vraiment définir exclusiveTouch pour toutes les sous-classes UIButtons + dans l'ensemble de votre application et pas seulement une seule vue, vous pouvez utiliser la méthode swizzling .

Vous utilisez le runtime objc pour remplacer willMoveToSuperview et y définir une touche exclusive. C'est très fiable et je n'ai jamais eu de problèmes avec cette technique.

J'aime particulièrement faire cela pour UISwitch , car la manipulation tactile des commutateurs peut être un peu compliquée et exclusiveTouch permettra d'éviter les bugs causés par des prises simultanées sur différents commutateurs

Échantillon extrait du lien ci-dessus et modifié pour que le paramètre exclusiveTouch soit défini:

#import <objc/runtime.h>


@implementation UIButton (INCButton)

+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];

        SEL originalSelector = @selector(willMoveToSuperview:);
        SEL swizzledSelector = @selector(inc_willMoveToSuperview:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        BOOL didAddMethod =
        class_addMethod(class,
                    originalSelector,
                    method_getImplementation(swizzledMethod),
                    method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                            swizzledSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

- (void)inc_willMoveToSuperview:(UIView *)newSuperview
{
    // This is correct and does not cause an infinite loop!
    // See the link for an explanation 
    [self inc_willMoveToSuperview:newSuperview];

    [self setExclusiveTouch:YES];
}

@end

Créez une catégorie et insérez ce code pour chaque classe que vous souhaitez modifier.

Question

Mon application a plusieurs boutons à travers l'application

Je veux définir Exclusive Touch tous ensemble en même temps. ou toutes les vues de l'application

nous pouvons définir individuellement par

[button setExclusiveTouch:YES];

Mais je veux définir à la fois pour tous les boutons de l'application

Pouvons-nous définir toutes les vues exclusives?

n'importe quel corps a une idée s'il vous plaît me suggérer.




[[UIButton appearance] setExclusiveTouch:YES];



Related