4

我的 viewController.m 中有 ac 函数。

int abc(int a, char* b)
{
//do something
}

我也有一个功能

-(void) callIncomingClass
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    //set the position of the button
    button.frame = CGRectMake(100, 170, 100, 30);

    //set the button's title
    [button setTitle:@"Click Me!" forState:UIControlStateNormal];

    //add the button to the view
    [self.view addSubview:button];
}

现在我想callIncomingClass从函数 abc 中调用。

你建议我怎么做??

为什么我想从 C 函数调用 Objective C 方法是,我无法在 C 函数中创建按钮或进行类似的处理。

以下代码是否有效:

int abc(int a, char* b)
{ 
    ViewController * tempObj = [[ViewController alloc] init];
    [tempObj callIncomingClass];
}

编辑:我在做什么的大图 有ac 库,即library.c 和library.h 文件。library.h 文件有一个具有回调函数的结构。这些需要分配函数指针。所以我有一个带有签名 int abc(int,char*) 的 ac 函数,该函数要分配给结构中的回调函数。

这个函数 abc 在 ViewController.m 中定义。理想情况下,我希望它在单独的文件中定义。但这也没关系。

所以现在,回调事件发生了,我想在视图上创建一个带有一些操作的 UIButton。由于我无法从 ac 函数创建 UIButton,因此我正在调用 ViewController 类的目标 C 方法,该方法创建 UIButton。

希望能清楚地了解我打算如何使用它。

4

3 回答 3

5

由于其他人和我自己说的话,您的按钮没有显示:您需要ViewController. 您正在创建一个全新的 ViewController 实例,它永远不会出现在屏幕上或被推送等。

您可以通过使用指向现有实例的全局变量来完成您需要做的事情。

这是您的 .m 的外观:

#import "ViewController.h"

static ViewController *viewController = nil;

@implementation ViewController

- (id)init {
    if ((self = [super init])) {
         viewController = self;
    }
    return self;
}

- (void)dealloc {
    viewController = nil;
}

-(void) callIncomingCreateButton {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    //set the position of the button
    button.frame = CGRectMake(100, 170, 100, 30);
    //set the button's title
    [button setTitle:@"Click Me!" forState:UIControlStateNormal];
    //add the button to the view
    [self.view addSubview:button];
}

- (IBAction)DemoCall:(id)sender {
    callIncoming(1, "a");
}

@end

int callIncoming(int a, char* b) {
    [viewController callIncomingCreateButton];
    return a;
}
于 2012-10-12T07:54:26.090 回答
1

您需要访问正确的ViewController*/ 实例,而不是任何旧的。如果您的 C 函数签名不允许您通过 avoid*或类似方法传入一些任意数据,那么您需要使用类方法和静态变量来保存临时指针,如下所示。

在您的目标 C 文件中:

static ViewController* cLibReceiver = NULL;

+(void) callIncomingClassOuter {
    [cLibReceiver callIncomingClass];
}

-(void) beforeTriggerCLibrary {
    cLibReceiver = self;
}

并在您的(不同的)Objective C文件abc()中:

int abc(int a, char* b)
{ 
    [ViewController callIncomingClassOuter];
}

在触发 C 库的地方,您需要这样做:

[theViewController beforeTriggerCLibrary]; // could be self, depending on context

c_library_call();

// optionally set cLibReciever back to NULL.

注意:我可能在方法头等方面有一些语法错误,我对目标 C 调用约定并不完全熟悉。类方法肯定+是。

注意 2:您可能不允许像这样扩展系统类 - 您可能需要定义自己的子类。同样,对 Objective C 不够熟悉。

于 2012-10-12T08:58:36.260 回答
0

假设您在 Objective-C 源文件中,从 C 函数调用 Objective-C 函数的工作方式与从任何其他 Objective-C 函数调用 Objective-C 函数完全相同。在任何一种情况下,如果你有一个指向ptr你想要调用函数的对象的指针,你写

[ptr callIncomingClass];

所以当然在任何一种情况下,您都需要以某种方式拥有指向要调用该函数的对象的指针。如果您在 Objective-C 函数中(即实例方法),则此类指针的通常“源”是(a)当您在与当前运行的方法相同的对象上调用方法时,隐含的“self”指针,( b) 调用当前运行方法的对象的某个实例变量,(c) 当前运行的函数或方法的参数,(d) 全局变量或其他函数调用的结果。在纯 C 中,您可以使用 (c) 和 (d),但不能使用 (a) 和 (b),因为您没有self.

于 2012-10-12T07:42:46.277 回答