【问题标题】:What's wrong with my Objective-C?我的 Objective-C 有什么问题?
【发布时间】:2011-03-11 13:21:42
【问题描述】:

我的代码有问题,我无法弄清楚。

编辑:请更正此代码。谢谢!

int stringLength = [theData length];
for (int i = 1; i <= stringLength; i++) {
        unichar currentCharacter = [theData characterAtIndex:i];
        int currentCharacterCode = keyCodeForKeyString(currentCharacter);
        CGPostKeyboardEvent((CGCharCode)0, (CGKeyCode)currentCharacterCode, true);
        CGPostKeyboardEvent((CGCharCode)0, (CGKeyCode)currentCharacterCode, false);
}

- (int)keyCodeForKeyString:(unichar)keyString
{
    if (strcmp(keyString, "a") == 0) return 0;
    if (strcmp(keyString, "s") == 0) return 1;
    if (strcmp(keyString, "d") == 0) return 2;
    if (strcmp(keyString, "f") == 0) return 3;
    if (strcmp(keyString, "h") == 0) return 4;
}

【问题讨论】:

  • 怎么了?有什么错误?它应该做什么?我们不是读心者....
  • 它应该从一串字符运行CGPostKeyboardEvent(模拟可可中的按键)。它应该在for循环中拆分字符串,找到正确的键码,然后将该键码放入CGPostKeyboardEvent。 Xcode 说Initialization makes pointer from integer without a castNo '-keyCodeForKeyString' method found
  • 它只能在 OSX 上运行,这就是问题所在!

标签: objective-c cocoa


【解决方案1】:

一方面,characterAtIndex 是零索引的。因此,您从 theData 的第二个字符开始,并且(假设 theDatatheString 具有相同的长度)在末尾读取一个字符(这是未定义的行为)。另一方面,characterAtIndex 返回unichar,而不是指向字符的指针。当您应该将指针作为参数传递时,您还调用了 keyCodeForKeyString on 指针。但是您可以更改 keyCodeForKeyString 以采用 unichar,而不是一个以空字符结尾的字符串。

【讨论】:

  • 啊,谢谢,我认为 [NSString length] 从 1 开始,但我没有意识到 characterAtIndex 从 0 开始。谢谢。什么是 unichar,我需要做什么?
  • unichar 代表一个 Unicode 代码单元。在内部,它是一个无符号短片。 [NSString length] not 是否从 1 开始。它可以为零,这意味着字符串为空(并且您不能调用 characterAtIndex)。还要记住零索引意味着最后一个字符是长度 - 1。
  • 我讨厌看起来很烦人,但您能更正一下代码吗?我哪儿也去不了。我会通过看什么是正确的来学习。这就是我得到的...for (int i = 1; i &lt;= stringLength; i++) { unichar currentCharacter = [theData characterAtIndex:i]; int currentCharacterCode = keyCodeForKeyString(currentCharacter); CGPostKeyboardEvent((CGCharCode)0, (CGKeyCode)currentCharacterCode, true); } - (int)keyCodeForKeyString:(unichar)keyString { if (strcmp(keyString, "a") == 0) return 0; if (strcmp(keyString, "s") == 0) return 1; ... ... 不知道为什么它不会格式化代码...
  • @Wind Up,请发布您的代码作为对问题的编辑。然后,您可以正确格式化它。您还没有修复循环索引。如果你使用unichar,你可以直接比较一个字符常量(例如'a')。注意单引号。您不要为此使用strcmp。另见stackoverflow.com/questions/1092695/objective-c-unichar-vs-char
  • 发条玩具:unichar 是单个字符,就像 char 一样。 C 字符串是指向字符数组的指针,通常声明为char[](例如char str[])或char *char *str)。 strcmp 只接受一个 C 字符串,不知道如何处理由 unichars 而不是 chars 组成的 C 字符串。由于您有一个unichar,您应该使用相等运算符简单地比较它; strcmp 仅适用于 char 的 C 字符串。
【解决方案2】:

这一行:

int currentCharacterCode = keyCodeForKeyString(currentCharacter);

是个问题。您似乎没有一个名为 keyCodeForKeyString 的函数。您确实有一个具有该名称的方法,但其语法是

int currentCharacterCode = [self keyCodeForKeyString: currentCharacter];
//                          ^^^^ I assume you are sending the message from the same object.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2017-11-27
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多