реализация одного метода из другого в Objective- C, объединение плагинов - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь объединить два плагина, написанных на Objective- C. У меня есть Plugin1 и Plugin2, которые работают независимо друг от друга. Я пытаюсь добавить код Plugin2.m в мою папку Plugin1 Classes и выполнять оба одновременно.

Когда я это делаю, кажется, сначала выполняется Plugin1.m, потому что у него есть вызовы IBAction а Plugin2.m нет? Это нормально, но я бы хотел запустить Plugin2.m в функции в Code1.m. Итак, в приведенном ниже коде, когда инициируется вызов IBAction в Plugin1, я хотел бы, чтобы он выполнял то, что обычно делает Plugin2, а затем продолжал использовать методы Plugin1.

Plugin1.h:

#import Plugin2.h

@interface Plugin1: NSWindowController {
...
}
+(void) Plugin2;
@end

Plugin1.m:

#import "Plugin1.h"
#import "Plugin2.h"

@implementation Plugin1

-(id) loadPlugin1
{
...
}

-(IBAction) computeStuff:(id)sender
{
[self Plugin2];
//Plugin2* testRun = [Plugin2 alloc] init];

...do other stuff
}

@end

Plugin2.h

@interface Plugin2 : PluginFilter {
...
}
@end

Plugin2.m:

#import Plugin2.h

@implementation Plugin2

-(void) initPlugin
{
...
}

@end 

К сожалению, я не могу устранить это изнутри Xcode, я мне нужно установить и протестировать плагин в моей программе для тестирования. Но когда я смотрю на консоль и пробую описанное выше, я получаю "- [Plugin1 Plugin2]: неопознанный селектор отправлен в экземпляр 0x7 ....

1 Ответ

0 голосов
/ 14 июля 2020

в интерфейсе плагина 1 вы определили

+(void)plugin2; 

, но не реализовали метод

+(void)plugin2 {

}

при вызове метода + вам нужно указать, из какого класса вы вызываете метод, потому что self относится к объекту, а не к классу.

[self.class plugin2];
// OR
[Plugin1 plugin2];

Подсказки: попробуйте следовать соглашениям об именах в objective- c.
Это поможет вам различать gui sh, если определением является -method: или Class

Рассмотрите возможность чтения примерно delegate шаблонов проектирования и использования <Protocols>

Также определите специальный -initPlugin в вашем Plugin2 и используйте возвращаемый тип. В противном случае вы ничего не инициализируете.

-(instancetype)initPlugin;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...