Domanda

#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

Sopra c'è una semplice modifica che ho creato con Logos.Per qualche motivo dopo l'installazione non funziona nulla, semplicemente non riesco a capire quale sia il problema e come posso risolverlo?

Altre domande che ho sono:

  • Perché dichiariamo classe come SBIconController quando c'è già a SBIconController classe?
  • Perché lo dichiariamo come sottoclasse di NSObject?
  • Perché non digitiamo semplicemente SBIconController quando chiamiamo il file [SBIconController sharedInstance] invece di [objc_getClass("SBIconController") sharedInstance]?

Grazie mille per il vostro aiuto!

È stato utile?

Soluzione

Il codice va bene.L'ho testato (non uso loghi) e iconTapped: il metodo viene effettivamente chiamato quando tocchi l'icona di un'app.Ma con cosa stai cercando di ottenere? isEditing?Questa proprietà indica se stai modificando SpringBoard (tocca e tieni premuta l'icona di un'app) e quando è uguale YES metodo iconTapped: NON viene chiamato quando si tocca l'icona.Si chiama solo quando isEditing equivale NO.Quindi ti consiglio di inserire alert senza if ([sbic isEditing]) per verificare se la tua modifica funziona.

Per quanto riguarda le altre tue domande:

  1. Quando abbiamo a che fare con API private non abbiamo intestazioni e riceveremo avvisi/errori se proviamo a utilizzarle.Nel tuo caso lo è SBIconController.Per risolvere questo problema possiamo scaricare intestazioni che altri hanno scaricato utilizzando vari strumenti come class-dump o dichiarare tu stesso queste API private.Nel tuo caso è quest'ultimo.
  2. Perché SBIconController eredita da NSObject.
  3. Lo puoi fare in entrambi i modi.Naturalmente, quando hai una dichiarazione di classe non è necessario utilizzare objc_getClass.E nel tuo caso non hai nemmeno bisogno di nessuna di queste cose.Puoi semplicemente usare self come faresti con qualsiasi altro metodo obj-C.Il tuo codice sarà simile a questo:

    %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
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top