Pergunta

#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

Acima está um ajuste simples que criei com o Logos.Por algum motivo, após a instalação, nada funciona, simplesmente não consigo descobrir qual é o problema e como posso resolver esse problema?

Outras perguntas que tenho são:

  • Por que declaramos classe como SBIconController quando já existe um SBIconController aula?
  • Por que o declaramos como uma subclasse de NSObject?
  • Por que não digitamos SBIconController quando chamamos o [SBIconController sharedInstance] em vez de [objc_getClass("SBIconController") sharedInstance]?

Muito obrigado por sua ajuda!

Foi útil?

Solução

O código está bom.Eu testei (não uso logotipos) e iconTapped: O método é realmente chamado quando você toca no ícone de um aplicativo.Mas o que você está tentando alcançar com isEditing?Esta propriedade indica se você está editando o SpringBoard (toque e segure um ícone de aplicativo) e quando é igual YES método iconTapped: NÃO é chamado quando o ícone é tocado.É chamado apenas quando isEditing é igual a NO.Então sugiro que você insira alerta sem if ([sbic isEditing]) para testar se seu ajuste está funcionando.

Quanto às suas outras perguntas:

  1. Ao lidar com APIs privadas, não temos cabeçalhos e receberemos avisos/erros se tentarmos usá-los.No seu caso é SBIconController.Para resolver esse problema, podemos baixar cabeçalhos que outros despejaram usando várias ferramentas, como class-dump, ou declarar você mesmo essas APIs privadas.No seu caso é o último.
  2. Porque SBIconController herda de NSObject.
  3. Você pode fazer isso de qualquer maneira.Claro, quando você tem uma declaração de classe você não precisa usar objc_getClass.E no seu caso você nem precisa de nenhuma dessas coisas.Você pode apenas usar self como você faria em qualquer outro método obj-C.Seu código ficará assim:

    %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
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top