2

当前项目在 cocos2d v2 下运行。

我有一个简单的 UITextField 添加到 CCLayer。

每当用户触摸 textField 时,就会出现一个键盘。

然后当用户触摸“返回”按钮时,键盘消失并清除输入。

我试图做的是当用户触摸 UITextField 之外的任何地方时做同样的事情。

我确实找到了一种方法并且它有效:

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch* touch = [touches anyObject];
    if(touch.view.tag != kTAGTextField){
        [[[[CCDirector sharedDirector] view] viewWithTag:kTAGTextField] resignFirstResponder];
    }
}

但是,此方法不调用函数:

- (BOOL)textFieldShouldReturn:(UITextField *)textField

我使用此函数进行一些计算并清除输入。因此,当文本字段为“resignFirstResponder”时,我希望 ccTouchesBegan 输入此 textFieldShouldReturn。

4

2 回答 2

4

From the Apple docs:

textFieldShouldReturn: Asks the delegate if the text field should process the pressing of the return button.

So it is only called when the user taps the return button.

I would rather create a method for the calculation and input clearing, and call that method whenever you want it to be called. Example:

- (void)calculateAndClearInput {
    // Do some calculations and clear the input.
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // Call your calculation and clearing method.
    [self calculateAndClearInput];
    return YES;
}

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    UITouch* touch = [touches anyObject];
    if (touch.view.tag != kTAGTextField) {
        [[[[CCDirector sharedDirector] view] viewWithTag:kTAGTextField] resignFirstResponder];
        // Call it here as well.
        [self calculateAndClearInput];
    }
}
于 2012-08-13T10:20:25.740 回答
1

正如@matsr 建议的那样,您应该考虑重新组织您的程序逻辑。resignFirstResponder在 UITextField 上调用没有意义textFieldShouldReturn:(UITextField *)textField,因为通常 resignFirstResponder 是从该方法中调用的。此外,您不应尝试以编程方式调用textFieldShouldReturn.

相反,我建议将您的计算代码移动到您的控制器/任何东西中的一个新方法中,textFieldShouldReturn并在您处理您resignFirstResponder在 UITextField 上调用的触摸时调用它。

这也有助于实现事件处理代码与计算/逻辑代码的分离。

于 2012-08-13T10:22:18.650 回答