1

我有一个依赖于 C 回调方法从 macbook 的触控板检索多点触控信息的应用程序。这是我如何将这些数据传达给用户的截断版本:

在 MT2AppDelegate.h 中:

#import "MyView.h"
@interface MT2AppDelegate : NSObject <NSApplicationDelegate> {
        IBOutlet NSTextField *L1;
        IBOutlet MyView *MTView;
}
@property (retain, nonatomic) IBOutlet MyView *MTView;
@property (retain, nonatomic) IBOutlet NSTextField *L1;

在 MT2AppDelegate.m 中:

#import "etc. etc."
static MT2AppDelegate *sharedWithCAppDelegateReference;
@implementation MT2AppDelegate
@synthesize L1, MTView;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    sharedWithCAppDelegateReference=self;

    [L1 setStringValue:@"Hello"];//this works
        [MTView drawRect2];//this also works

    MTDeviceRef dev = MTDeviceCreateDefault();
    MTRegisterContactFrameCallback(dev, callback);
    MTDeviceStart(dev, 0);
}


int callback( int example, float etc) {

                [sharedWithCAppDelegateReference->L1 setStringValue:@"hello"];//this works 
                [sharedWithCAppDelegateReference->MTView drawRect2];//this does NOT work
        return 0;
}

因此,出于某种原因,在一个 IBOutlet 上使用函数可以在 C 中正常工作,而另一个则什么也不做。相同的两个函数都在 Objective-c 中工作。我似乎也无法从 C 中的应用程序委托调用函数。例如,[sharedWithCAppDelegateReference setPoint];什​​么也不做。

此外,如果有更优雅的方式来做到这一点(我敢肯定有),我会全神贯注。这里发生的是这个回调函数不断更新,报告触控板上手指位置的信息。我想为视图设置动画,以便它提供手指位置的视觉表示。应用程序 FingerMgmt 在这方面做得很好,但没有可用的源代码。

我目前有我的应用程序委托,其中包含回调函数,以及另一个类(“MyView”),它是我的应用程序窗口中的视图类。应用程序委托通过界面构建​​器中的 IBOutlet 链接到视图,我计划将命令传递给它以更新代表手指的椭圆的位置。但同样,这对我不起作用。

4

1 回答 1

1

不要使用->; 完全不是标准的 Obj-C 氛围。此外,实例变量和属性应以小写字母开头。

潜在的问题是回调 API 没有指向上下文的指针。大多数回调 API 的定义如下:

void fooBackMan(int a, float b, void *context);

您在哪里设置它们,例如:

extern set_up_callback(void(*callb)(int,float,void*), void*);
set_up_callback(&myCallbackFunc, someObject);

而且,当回调被调用时,上下文指针指向你传递给set_up_callback()函数的任何东西。通常,您将传递self或其他一些对象作为您的上下文(当然,首先保留),然后您可以像任何其他对象一样对其进行类型转换和调用方法。

您的回调没有这样做,因此,您需要全局变量,并且您的解决方案与预期的行为几乎一致。保存以供使用->。不要那样做。

相反,我会定义一个类似的方法,然后将其作为我的func-handleMTCallbackWithExample:(int)anEx etc:(float)anEtc;中的一行代码调用。callback()

于 2011-05-29T04:54:14.657 回答