【问题标题】:Why is Xcode Giving Me These Errors?为什么 Xcode 会给我这些错误?
【发布时间】:2009-07-02 06:39:02
【问题描述】:

我得到的错误是 Xcode 说 3 件事未声明(见下图) alt text http://snapplr.com/snap/ks4h

但是在头文件中我已经声明了它们(见下图)

alt text http://snapplr.com/snap/htmb

为什么我在声明这些错误后会收到这些错误。

完整代码:

头文件。

#import <Foundation/Foundation.h>


@interface HotKeyController : NSObject {
    IBOutlet NSButton *cmdHK;
    IBOutlet NSButton *ctrHK;
    IBOutlet NSButton *optHK;
    IBOutlet NSPopUpButton *keyHK;
    IBOutlet NSWindow *window;
    IBOutlet NSWindow *searchWindow;
    IBOutlet NSWindow *entryWindow;
}

@end

实施文件

#import "HotKeyController.h"
#include <Carbon/Carbon.h>

@implementation HotKeyController

OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent,void *userData)
{
    EventHotKeyID hkCom;
    GetEventParameter(theEvent,kEventParamDirectObject,typeEventHotKeyID,NULL,sizeof(hkCom),NULL,&hkCom);
    int l = hkCom.id;

    switch (l) {
        case 1: [window makeKeyAndOrderFront:NSApp];  
            break;
        case 2: [searchWindow makeKeyAndOrderFront:nil];
            break;
        case 3: [entryWindow makeKeyAndOrderFront:nil];
            break;  
    }
    return noErr;
}

- (void)awakeFromNib
{
    //Register the Hotkeys
    EventHotKeyRef gMyHotKeyRef;
    EventHotKeyID gMyHotKeyID;
    EventTypeSpec eventType;
    eventType.eventClass=kEventClassKeyboard;
    eventType.eventKind=kEventHotKeyPressed;


    InstallApplicationEventHandler(&MyHotKeyHandler,1,&eventType,pl,NULL);

    gMyHotKeyID.signature='htk1';
    gMyHotKeyID.id=1;
    if([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowMain"]!=-999) {
        RegisterEventHotKey([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowMain"], [[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowMainModifier"], gMyHotKeyID, GetApplicationEventTarget(), 0, &gMyHotKeyRef);
    }

    gMyHotKeyID.signature='htk2';
    gMyHotKeyID.id=2;
    if([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowSearch"]!=-999) {
        RegisterEventHotKey([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowSearch"], [[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowSearchModifier"], gMyHotKeyID, GetApplicationEventTarget(), 0, &gMyHotKeyRef);
    }

    gMyHotKeyID.signature='htk3';
    gMyHotKeyID.id=3;
    if([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowEntry"]!=-999) {
        RegisterEventHotKey([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowEntry"], [[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyShowEntryModifiers"], gMyHotKeyID, GetApplicationEventTarget(), 0, &gMyHotKeyRef);
    }

}

@end

【问题讨论】:

    标签: objective-c cocoa macos-carbon


    【解决方案1】:

    我得到的错误是 Xcode 说 3 件事未声明......

    但是在头文件中我已经声明了它们……

    为什么我在 [在 HotKeyController 类中] 声明了这些错误。

    因为这些行在函数中,而不是在 HotKeyController 类的方法中。把函数放在哪里都没有关系(在@implementation 内);它仍然是一个函数,而不是一个方法。

    如何让userData 参数指向我的 HotKeyController?

    您在创建事件处理程序时设置。事实上,您已经将其设置为“pl”,不管它是什么。

    【讨论】:

    【解决方案2】:

    您必须显示更多文件才能确定。您是否正确导入头文件?头文件保存了吗?

    尝试插入显式的 self-> 引用,您可能会收到更显着的错误消息。

    另外,尝试预处理实现文件(在“构建”菜单中),这可能会揭示为什么找不到 ivar。

    【讨论】:

    • 如何预处理实现文件?我还用完整的代码更新了这个问题。
    • 您添加的附加上下文会立即很有帮助。对 ivars 的引用必须在 Objective-C 方法定义中,因为需要隐式 self 参数才能访问它们。你显然不能这样做,因为你正在实现一个 Carbon 回调函数。但是,如果您将 userData 参数设置为指向 HotKeyController 的指针,您应该能够以这种方式访问​​它们。
    • HotKeyController *controller = (HotKeyController *)userData;控制器->窗口;这是基本的 C 语言。
    • sigh...放到MyHotKeyHandler中。第一行在 switch 语句之前的某处。将所有对“窗口”的引用替换为 controller->window,将 searchWindow 替换为 controller->searchWindow,等等。如果编译器抱怨对 ivars 的直接访问(不确定在这种情况下是否会这样做),您将需要创建访问器函数并调用它们。
    • 嘿...这很可笑,但我会一起玩,因为我很开心。您在声明后忘记了分号。这应该是显而易见的。
    【解决方案3】:

    NSWindow 没有在 Foundation 框架中定义, 您必须导入正确的标头、ApplicationKit 或 Cocoa。

    【讨论】:

    • 未能导入 AppKit 标头不会导致他的实例变量丢失。他的问题是他试图从一个函数中访问它们。
    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2011-11-29
    相关资源
    最近更新 更多