2013-04-16 127 views
0

我有一個分組表格視圖,並試圖設置一個新的第一響應者到一個文本字段,當用戶點擊輸入。急救員沒有正確設置

這對我來說並不新鮮,我的代碼在我做了一些不相關的更改之前就工作了,而現在它沒有。當我設置第一個響應者時,我有一個指向正確文本字段的指針,沒有任何反應。

焦點完全從任何文本字段中消失,並且鍵盤保持在屏幕上。然後,輸入和「隱藏鍵盤」鍵都會停止,直到用戶再次重新啓動文本字段的焦點。

下面是代碼:

- (void)uiTextFieldShouldReturn:(ObjectEditTextField *)uiTextField 
{ 
     if ((group.fields.count - 1) > uiTextField.fieldTag) 
     { 

     //loop through every table group 
     for (int i = uiTextField.fieldTag + 1; i < group.fields.count; i++) { 

      //get whatever field is in the row (not necessarily a text field) 

      ObjectEditField *field = [group.fields objectAtIndex:i]; 

      // a check if the field is of type UITextField 
      if (field.propName && field.updateObjectOnEdit == YES && [field isKindOfClass:[UITextField class]]) { 
       // set the active field 
       activeField = field; 

       // adjust the table view offset to make sure the text field is visble 
       [self setTableViewOffsetForTextField:field]; 

       // obtain a pointer to the textfield object and set it to be the first responder 
       UITextField *textField = (UITextField *)field; 
       NSLog(@"field %@", textField.fieldLabel); 
       if (![textField.field isFirstResponder]) { 

        [textField.field becomeFirstResponder]; 
        return; 
       } 
       break; 
      } 
     } 
    } 
+1

重點是什麼?如果「沒有任何反應」,你怎麼能擺脫「焦點」?你有沒有「無關的變化」以前的版本檢查相同的設備/模擬器? –

+0

我的猜測是這個問題根本與這個代碼無關。檢查你的文本字段('ObjectEditField')代碼中發生了什麼。當'becomeFirstResponder'被調用時,它可能正在做些什麼?也許它阻止了主線程?也許其他事情發生在其他領域成爲第一響應者? – Sulthan

+0

它是否在模態視圖控制器? – Sulthan

回答

0

首先,我絕對會驗證您的以上描述,您的代碼「工作之前」和改變,是「無關」。根據定義,對工作代碼所做的任何更改都會導致其無法繼續工作。如果不是直接的話,那麼間接地由於副作用。

所有,在我從你貼的代碼示例跳出是行:

// adjust the table view offset to make sure the text field is visble 
[self setTableViewOffsetForTextField:field]; 

你是做正確的事,確保包含該文本框的細胞滾動到視圖。一種可能性是,當你把它的滾動到視圖這取決於你的代碼的其餘部分,可能會導致一些問題,如小區創建:

  1. 文本字段您發送becomeFirstResponder到一個不同的實例比textField實際上在單元格中。

  2. 當您調用becomeFirstResponder時,由於動畫將textField滾動到視圖中,因此尚未創建單元格。

我會背出你發回去工作版本,真正確保正確的文本框在一個預期的時間發送becomeFirstResponder任何更改。

+0

唯一改變的是該文件將數據保存到字典而不是對象。沒有其他改變。在我正在測試的這種情況下,我試圖設置第一響應者的單元實際上仍然可見,並且沒有滾動發生。 (他們是兩個相鄰的行)我同意某些事情必須改變。我只是不知道什麼,因爲唯一真正改變的是數據保存到哪裏。 – JMD

0

通過評論,該字段是在模態(呈現)控制器內。

首先解釋 - 默認情況下,如果模態控制器中的文本字段失去焦點,鍵盤不會隱藏。這是通過方法-[UIViewController disablesAutomaticKeyboardDismissal]

此方法的默認實現返回控制是當視圖控制器的模式呈現樣式設置爲UIModalPresentationFormSheet和其他演示文稿樣式;否。因此,系統通常不允許鍵盤被模態形式解散。

這解釋了爲什麼鍵盤的行爲方式。沒有文本字段被聚焦,鍵盤也不會被隱藏,因爲我們在模態控制器內。

那麼,會發生什麼?我們知道當前的文本字段會使第一響應者辭職,並且視圖不會成爲第一響應者,或者不可視視圖成爲第一響應者。

好了,你整個代碼看起來很可疑:

ObjectEditField *field = [group.fields objectAtIndex:i]; 

在這裏,我們有型ObjectEditField

[field isKindOfClass:[UITextField class]] 

的對象現在,我們正在測試,如果該字段的UITextField一個子類。這是非常可疑。如果它是ObjectEditField,它怎麼可能是UITextField呢?

讓我們繼續

UITextField *textField = (UITextField *)field; 

奧基,讓我們假定它是一個UITextField

if (![textField.field isFirstResponder]) { 

再次,一些非常可疑。 A UITextField沒有field屬性。

所以:

[textField.field becomeFirstResponder]; 

被稱爲不明物體上。我們甚至不知道它是否爲UITextField

請注意,大多數代碼應該在IDE中發出警告。

解決方案:

  1. 清理你的代碼,查警告。
  2. becomeFirstResponder之前撥打NSLog(@"%@", textField.field)。檢查日誌。