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関数からObjectiveCメソッドを呼び出したいのは、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を作成できないため、UIButtonを作成するViewControllerクラスのObjectiveCメソッドを呼び出しています。

これで、これをどのように使用する予定であるかが明確になることを願っています。

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関数のシグネチャで、または同様の方法で任意のデータを渡せない場合はvoid*、次のように、クラスメソッドと静的変数を使用して一時ポインタを保持する必要があります。

Objective Cファイルの場合:

static ViewController* cLibReceiver = NULL;

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

-(void) beforeTriggerCLibrary {
    cLibReceiver = self;
}

そしてあなたの(異なる)ObjectiveCファイル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.

注:メソッドヘッダーなどの構文が間違っている可能性があります。ObjectiveCの呼び出し規約に完全には精通していません。クラスメソッドは間違いなく+です。

注2:このようにシステムクラスを拡張することは許可されていない場合があります。独自のサブクラスを定義する必要がある場合があります。繰り返しになりますが、ObjectiveCについては十分に理解していません。

于 2012-10-12T08:58:36.260 に答える
0

Objective-Cのソースファイルを使用しているとすると、C関数からObjective-C関数を呼び出すことは、他のObjective-C関数からObjective-C関数を呼び出すこととまったく同じように機能します。いずれの場合もptr、関数を呼び出したいオブジェクトへのポインターがある場合は、次のように記述します。

[ptr callIncomingClass];

したがって、もちろんどちらの場合でも、関数を呼び出したいオブジェクトへのポインタを何らかの方法で用意する必要があります。Objective-C関数(つまりインスタンスメソッド)を使用している場合、そのようなポインターの通常の「ソース」は、(a)現在実行中のmethidと同じオブジェクトでメソッドを呼び出すときの暗黙の「self」ポインターです。 b)現在実行中のメソッドが呼び出されたオブジェクトのインスタンス変数、(c)現在実行中の関数またはメソッドへの引数、(d)グローバル変数または他の関数呼び出しの結果。プレーンCでは、(c)と(d)を使用できますが、。がないため、(a)と(b)は使用できませんself

于 2012-10-12T07:42:46.277 に答える