2012-11-21 71 views
0

之后的调用功能所以我只是想只要用户按下UITextField上的键返回,键盘就会隐藏,然后调用一个函数。现在我有:隐藏返回键[UITextField]上的键盘和

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    if(textField == _currentPasswordField) 
    { 
     [textField resignFirstResponder]; 
     [_passwordField becomeFirstResponder]; 
     return YES; 
    } 
    else if (textField == _passwordField) 
    { 
     [textField resignFirstResponder]; 
     [_confirmPasswordField becomeFirstResponder]; 
     return YES; 
    } 
    else 
    { 
     [textField resignFirstResponder]; 
     [self changePassword]; 
     return YES; 
    } 
} 

但是,整个changePassword函数返回后键盘被隐藏。我怎样才能隐藏它,然后打电话给我的功能?

谢谢!

+0

'changePassword'做什么?运行需要很长时间吗?它是否提供用户界面? –

+0

不显示UI ...只是调用我的服务器并尝试更改给定user_id的密码。 – abisson

回答

0

问题是您的changePassword方法需要很长时间才能运行,因为它正在通过网络与服务器通话。

所有用户界面更新,例如键盘隐藏动画,都是从主线程触发的。当您在主线程上调用缓慢的方法时,会阻止发生这些用户界面更新。

您需要将主叫线路上的呼叫移至changePassword。有很多方法可以做到这一点。其中一个最简单的方法是使用大中央调度(GCD),像这样:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [self changePassword]; 
}); 

然而,这是不是安全的,除非你的changePassword方法是线程安全的,所以你需要想想你在做什么在changePassword中做什么,它会在后台线程上运行,而其他方法正在主线程上运行。

您需要阅读Concurrency Programming Guide或观看部分WWDC视频,如会话211 - 从WWDC 2010以Grand Central Dispatch简化iPhone应用程序开发。

+0

非常感谢! – abisson