Как я могу заставить UIButton вызывать целевой класс и перехватывать этот метод? (используя theos для компиляции джейлбрейк-твика)

Я пытаюсь поместить UIButton в iPhone MobileSMS.app (приложение для сообщений). Он успешно появляется в представлении, но когда вы нажимаете его, он, конечно, падает, потому что он не вызывает какой-либо целевой класс и не перехватывает метод. Целевой класс и метод, который я хотел бы перехватить, находится во втором коде ниже, как я могу добиться вызова этого при нажатии кнопки? (Моя главная цель — поместить кнопку в окно беседы, и при нажатии на нее будет принудительно отправляться SMS вместо автоматического использования iMessage.)

#import <UIKit/UIKit.h>
#import <ChatKit/ChatKit.h>

@interface CKTranscriptCollectionViewController : UIViewController
@end

%hook CKTranscriptCollectionViewController
-(void)loadView {
   %orig;
   UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
   [button setTitle:@"SMS" forState:UIControlStateNormal]; 
   button.frame = CGRectMake(0, 0, 50, 100);
   [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
   [self.view addSubview:button]; 
}

-(void)buttonPressed {
    NSLog(@"Button Pressed!");
}

%end

Класс и метод, который я хотел бы вызвать при нажатии кнопки (которая принадлежит заголовку «ChatKit/CKConversation.h»):

%hook CKConversation
-(BOOL)forceMMS {

    return TRUE;

}
%end

person Brandon Salgado    schedule 10.09.2014    source источник


Ответы (2)


его сбой, потому что он проверяет параметр. Попробуйте изменить определение метода на:

-(void)buttonPressed:(id)sender 

или измените цель на:

[button addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside];
person Community    schedule 10.09.2014
comment
как я могу заставить его вызывать forceMMS при нажатии кнопки? - person Brandon Salgado; 10.09.2014
comment
я не знаю чатки, это просто способ правильно подключить метод - person ; 10.09.2014

Опссс с логотипами, чтобы определить новое действие/метод, который вы должны написать

%new перед этим действием или методом

и я советую вам создать частный класс, чтобы использовать это действие таким образом

[self buttonPressed];

Частный класс должен выглядеть

@interface CKTranscriptCollectionViewController (TWEAKNAME)
-(void)buttonPressed;
@end

так что ваш код должен выглядеть

#import <UIKit/UIKit.h>
#import <ChatKit/ChatKit.h>

@interface CKTranscriptCollectionViewController : UIViewController
@end

@interface CKTranscriptCollectionViewController (TWEAKNAME)
-(void)buttonPressed;
@end

%hook CKTranscriptCollectionViewController
-(void)loadView {
   %orig;
   UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
   [button setTitle:@"SMS" forState:UIControlStateNormal]; 
   button.frame = CGRectMake(0, 0, 50, 100);
   [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
   [self.view addSubview:button]; 
}

%new
-(void)buttonPressed {
    NSLog(@"Button Pressed!");
}

%end

Удачи

person iMokhles    schedule 11.09.2014
comment
Это работает, но как заставить его вызывать это при нажатии: %hook CKConversation -(BOOL)forceMMS { return TRUE; } %конец - person Brandon Salgado; 13.09.2014