以编程方式调用textFieldShouldReturn

时间:2012-08-13 10:09:40

标签: ios cocos2d-iphone uitextfield

当前项目在cocos2d v2下运行。

我在CCLayer中添加了一个简单的UITextField。

每当用户触摸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

我使用此功能进行一些计算并清除输入。因此,我希望ccTouchesBegan在文本字段为" resignFirstResponder"。

时输入此textFieldShouldReturn。

2 个答案:

答案 0 :(得分:3)

来自the Apple docs

  

<强> textFieldShouldReturn:   询问代表是否文本字段应该按下返回按钮。

所以只有当用户点击返回按钮时才会调用它。

我宁愿创建一个计算和输入清除的方法,并在您希望它被调用时调用该方法。例如:

- (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];
    }
}

答案 1 :(得分:1)

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

相反,我建议将您的计算代码移动到控制器/中的新方法中,并在textFieldShouldReturn和在UITextField上调用resignFirstResponder的触摸时调用它们。

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