проблема смешивания Objective C и C ++ в одном файле - PullRequest
3 голосов
/ 22 декабря 2011

У меня есть файл .mm, в котором у меня есть некоторая функция c ++ и несколько строчек цели c.

Например

void display()
{
....
....
}

void doSomthing()
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
[button addTarget:??? action:@selector(display) ....]

[rooView addSubView:UIButton];
}

Я не понимаю, как я могу вызвать функцию отображения, которая определена в том же файле мм? какой будет моя addTarget? (само / это не работает в моем случае)

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

Вы не можете использовать @selector() для ссылки на функцию, вы можете использовать ее только для ссылки на метод target-c.

Кроме того, класс UIButton не способен выполнять вызов функции при нажатии на него. Он может выполнять только метод target-c.

Однако вы можете "обернуть" метод target-c вокруг функции:

- (void)display:(id)sender
{
    display();
}

Разрешение этого:

[button addTarget:self action:@selector(display:) ....];

Но если вы пишете свою собственную функцию display (), то вы можете просто поместить ее содержимое в метод display.

2 голосов
/ 22 декабря 2011

Вам нужен класс Objective-C и некоторые методы для переноса вызовов функций C ++.

@interface WrapperClass : NSObject

-(void) display;

@end

void display()
{
....
....
}

@implementation WrapperClass

-(void) display
{
    display();
}

@end

static WrapperClass* wrapperObj = nil;

void doSomthing()
{
    if (wrapperObj == nil)
    {
        wrapperObj = [[WrapperClass alloc] init];
    }

    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    [button addTarget: wrapperObj action:@selector(display) forControlEvents: whatever];
    [rooView addSubView:UIButton];
}
...