2011-06-08 84 views
0

我有一個名爲LoginViewController的UIViewController。 UIViewController有兩個UITextField,用戶名和密碼。當第一次啓動應用程序並且鑰匙串中沒有任何憑證時,這將顯示爲modalViewController。當用戶點擊登錄按鈕時,呈現的鍵盤被解除。代碼是:modalViewController問題與UITextField第一響應者

- (IBAction) loginClick: (UIButton *) sender 
{ 
    if ([username isFirstResponder]){ 
     [username resignFirstResponder]; 
    } 

    if ([password isFirstResponder]){ 
     [password resignFirstResponder]; 
    } 

    [RKObjectManager sharedManager].client.username = username.text; 
    [RKObjectManager sharedManager].client.password = password.text; 
    [progressLock lock]; 
    [progressLock unlockWithCondition:0]; 
    [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES]; 
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/account/verify.json" objectClass:[Login class] delegate: self]; 
} 

現在在應用程序中有一個選項按鈕。當這是點擊它會呈現一個modalViewController,它有一個註銷按鈕。點擊這個註銷按鈕將再次呈現LoginViewController。代碼是:

- (IBAction) logout:(id)sender 
{ 
    NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString * username = [standardDefaults stringForKey:@"kApplicationUserNameKey"]; 
    NSError * error = nil; 

    [standardDefaults removeObjectForKey:@"kApplicationUserNameKey"]; 
    [SFHFKeychainUtils deleteItemForUsername:username andServiceName:@"convore" error:&error]; 
    LoginViewController* lvc = [[LoginViewController alloc] init]; 
    lvc.delegate = self; 
    [self.mgvc.groups removeAllObjects]; 
    [self.mgvc.table reloadData]; 

    Topic * topic = [Topic object]; 
    topic.tid = [NSNumber numberWithInt:-2]; 
    self.mgvc.detailViewController.topic = topic; 
    self.mgvc.detailViewController.detailItem = topic.tid; 

    [self presentModalViewController:lvc animated:YES]; 
    [lvc release]; 
} 

奇怪的是,我似乎無法解僱鍵盤,當我點擊登錄按鈕這次。爲什麼是這樣?是否因爲從現在開始,我正在使用modalviewcontroller顯示LoginViewController?我如何解決這個奇怪的問題?

回答

0

我不知道你不能否認鍵盤的事實是因爲在模態視圖中顯示登錄名,也沒有發現任何明顯的代碼錯誤。

我會建議你改變你的流量,使:

  1. 註銷按鈕解僱你的第一個模式的看法和,

  2. 登錄視圖中顯示爲普通視圖,一旦模式視圖消失。

明確,你可以做2或者通過多種手段之一:

  1. 努力,推動登錄視圖控制器的導航控制器(如果有的話);

  2. 在標籤欄控制器中進行選擇(如果使用的話);

  3. 您的模態視圖顯示在視圖上方;當模式被解除時,該視圖再次出現,因此其視圖控制器的選擇器被調用;這是您可以檢查您是否登錄或註銷並在必要時顯示登錄名的地方;如果您不知道如何檢測是否處於進出狀態,那麼當您關閉註銷模式視圖時,您始終可以在視圖控制器中設置一個標誌。

    1. (讀您的評論後:模式的看法是不是全屏,所以viewWillAppear不叫:你可以自己送viewWillAppear,或發送不同,自定義消息,你的上級視圖控制器,使其知道登錄視圖應該顯示(並可能刷新視圖)

    2. 編輯:嘗試這樣的事情(這需要你打電話給你自己的選擇,而不是viewWillAppear):

      [baseNonModalViewController performSelector:@selector(yourSelector) withObject:nil afterDelay:0.0];

使用0執行performSelector。0延遲僅具有調度yourSelector在主循環上執行的效果。這樣,首先模式將被徹底解散,然後登錄視圖將被顯示。

+0

這是一個好主意,所以你的意思是[self dismissModalViewControllerAnimated:YES]; [self presentModalViewController:lvc animated:YES]; ??我試過了,它不起作用..也許這不是它應該的方式 – adit 2011-06-08 15:54:24

+0

你應該嘗試從模態視圖之外做到這一點,以產生影響。查看我的編輯,特別是我添加的選項3。 – sergio 2011-06-08 15:55:56

+0

我怎樣才能從外面做到這一點?代表你的意思? – adit 2011-06-08 15:57:11

相關問題