【问题标题】:issue with mixing Objective C and C++ in single file在单个文件中混合 Objective C 和 C++ 的问题
【发布时间】:2011-12-22 09:06:03
【问题描述】:

我有 .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];
}

我不明白如何调用在同一个 mm 文件中定义的显示函数? 我的 addTarget 是什么? (自我/这在我的情况下不起作用)

【问题讨论】:

  • 目标是接收display消息的对象。

标签: iphone objective-c ios5 xcode4.2


【解决方案1】:

你不能用@selector()来引用一个函数,你只能用它来引用一个objective-c方法。

此外,UIButton 类在单击时无法执行函数调用。它只能执行objective-c方法。

但是,您可以在函数周围“包装”一个 Objective-c 方法:

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

允许这样做:

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

但是如果你是自己写的 display() 函数,那么你也可以把它的内容放在 display 方法中。

【讨论】:

  • 如果我在 mm 文件中声明了目标 c 函数,例如 -(void) display { } 它显示以下错误“缺少方法声明的上下文”
  • @chetan:您还需要一个 Objective-C 类来发送显示消息。您可以在 .mm 文件中定义它。
【解决方案2】:

您需要一个 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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多