Question

#import <UIKit/UIAlertView.h>

@class NSObject;

@interface SBIconController : NSObject
+ (SBIconController *)sharedInstance;
- (BOOL)isEditing;
@end

%hook SBIconController
-(void)iconTapped:(id)tapped {
    SBIconController *sbic = [objc_getClass("SBIconController") sharedInstance];
    if ([sbic isEditing]) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message"  message:[NSString stringWithFormat:@"%@", tapped] delegate:nil cancelButtonTitle:@"OK"  otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }
    %orig;
}
%end

Ci-dessus, un simple ajustement que j'ai créé avec Logos.Pour une raison quelconque, après l'installation, rien ne fonctionne, je n'arrive tout simplement pas à comprendre quel est le problème et comment puis-je résoudre ce problème ?

Les autres questions que j'ai sont :

  • Pourquoi déclarons-nous la classe comme SBIconController quand il y a déjà un SBIconController classe?
  • Pourquoi le déclarons-nous comme une sous-classe de NSObject?
  • Pourquoi ne tapons-nous pas simplement SBIconController lorsque nous appelons le [SBIconController sharedInstance] au lieu de [objc_getClass("SBIconController") sharedInstance]?

Merci beaucoup pour votre aide!

Était-ce utile?

La solution

Le code est bien.Je l'ai testé (je n'utilise pas de logos) et iconTapped: La méthode est en effet appelée lorsque vous appuyez sur l’icône d’une application.Mais qu'essayez-vous de réaliser avec isEditing?Cette propriété indique si vous modifiez SpringBoard (appuyez longuement sur l'icône d'une application) et quand elle est égale à YES méthode iconTapped: n'est PAS appelé lorsque l'icône est enfoncée.On l'appelle seulement quand isEditing équivaut à NO.Je vous suggère donc d'insérer une alerte sans if ([sbic isEditing]) pour tester si votre réglage fonctionne.

Quant à vos autres questions :

  1. Lorsque nous traitons avec des API privées, nous n'avons pas d'en-têtes et recevrons des avertissements/erreurs si nous essayons de les utiliser.Dans votre cas, c'est SBIconController.Pour résoudre ce problème, nous pouvons soit télécharger les en-têtes que d'autres ont vidés à l'aide de divers outils tels que le dump de classe, soit déclarer vous-même ces API privées.Dans votre cas, c'est ce dernier.
  2. Parce que SBIconController hérite de NSObject.
  3. Vous pouvez le faire de toute façon.Bien sûr, lorsque vous avez une déclaration de classe, vous n'avez pas besoin d'utiliser objc_getClass.Et dans votre cas, vous n’avez même besoin d’aucune de ces choses.Vous pouvez simplement utiliser self comme vous le feriez dans n'importe quelle autre méthode obj-C.Votre code ressemblera à ceci :

    %hook SBIconController
    -(void)iconTapped:(id)tapped {
        if ([self isEditing]) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message"  message:[NSString stringWithFormat:@"%@", tapped] delegate:nil cancelButtonTitle:@"OK"  otherButtonTitles:nil];
            [alertView show];
            [alertView release];
        }
        %orig;
    }
    %end
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top