Frage

#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

Oben ist eine einfache Optimierung, die ich mit Logos erstellt habe.Aus irgendeinem Grund funktioniert nach der Installation nichts, ich kann einfach nicht herausfinden, was das Problem ist und wie kann ich dieses Problem lösen?

Andere Fragen, die ich habe, sind:

  • Warum deklarieren wir Klassen wie SBIconController wenn es schon eine gibt SBIconController klasse?
  • Warum deklarieren wir es als Unterklasse von NSObject?
  • Warum geben wir nicht einfach SBIconController ein, wenn wir das aufrufen [SBIconController sharedInstance] statt [objc_getClass("SBIconController") sharedInstance]?

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Der Code ist in Ordnung.Ich habe es getestet (ich benutze keine Logos) und iconTapped: die Methode wird tatsächlich aufgerufen, wenn Sie auf ein App-Symbol tippen.Aber was versuchst du damit zu erreichen isEditing?Diese Eigenschaft gibt an, ob Sie SpringBoard bearbeiten (tippen und halten Sie ein App-Symbol) und wann es gleich ist YES Methode iconTapped: wird NICHT aufgerufen, wenn auf das Symbol getippt wird.Es wird nur aufgerufen, wenn isEditing gleich NO.Also schlage ich vor, dass Sie alert ohne einfügen if ([sbic isEditing]) um zu testen, ob Ihre Optimierung funktioniert.

Wie für Ihre anderen Fragen:

  1. Beim Umgang mit privaten APIs haben wir keine Header und erhalten Warnungen / Fehler, wenn wir versuchen, sie zu verwenden.In deinem Fall ist es SBIconController.Um dieses Problem zu lösen, können wir entweder Header herunterladen, die andere mit verschiedenen Tools wie class-dump ausgegeben haben, oder diese privaten APIs selbst deklarieren.In Ihrem Fall ist es letzteres.
  2. Da SBIconController erbt von NSObject.
  3. Du kannst es so oder so machen.Wenn Sie eine Klassendeklaration haben, müssen Sie diese natürlich nicht verwenden objc_getClass.Und in Ihrem Fall brauchen Sie keines dieser Dinge.Sie können einfach verwenden self wie bei jeder anderen obj-C-Methode.Ihr Code wird so aussehen:

    %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
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top