2012-12-17 73 views
4

我有一個實施UITableView的基於iOS 6的項目。表格視圖中的每個單元格都包含允許用戶輸入信息的UITextField。如果用戶在點擊另一個單元格(文本字段)時清除了文本字段或刪除了字段中的所有輸入(即[textfield length] == 0),它將從表格​​視圖中刪除之前的單元格(文本字段),因爲它是空的 - 這可以避免在表格視圖中積累空單元格。嘗試刪除包含拒絕辭職的第一響應者的行

這是所有做用一種叫做-textFieldEditingDidEnd:方法,其觸發的UIControlEventEditingDidEnd事件的文本字段:

- (void)textFieldEditingDidEnd:(UITextField *)textField { 

    NSIndexPath *indexPath = // Index path of the row in the table view 

    if ([textField.text length] == 0) { 
     // Delete the cell from the table view 
     [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    } 

} 

然而,當代碼與在控制檯上顯示以下信息發射應用程序崩潰:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to delete row containing first responder that refused to resign'

我以前從未見過此消息,並有不似乎是它特別多引用在網上搜索時。我將不勝感激任何有關如何解決此問題的建議。

+0

嘗試把[textField resignFirstResponder];在刪除行之前,看看是否有幫助。 – Bergasms

+0

謝謝,但之前嘗試過。不走,同樣的問題。 – Skoota

回答

11

我以前從未見過這條消息,但是如果我看到它會立即產生衝動:嘗試延遲的性能。即使這樣簡單的東西可能是一個有趣的實驗:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView deleteRowsAtIndexPaths:@[indexPath] 
    withRowAnimation:UITableViewRowAnimationAutomatic]; 
}); 

我在這裏想到的是,讓我們不要嘗試刪除該行,而文本字段仍處於(即同時textFieldEditingDidEnd仍在運行)報告;讓我們給runloop一個完成它的週期的機會。

+0

完美工作,有道理。謝謝你的幫助! – Skoota

+0

Cool-o-rama!想想我只是在猜測......!但是,我的想法並非完全沒有任何意義, autolayout使用了一個額外的runloop循環,所以在iOS 6中很多關於在同一個runloop中可以避開的東西已經發生了變化。底層架構已經從根本上改變了。所以我在各種情況下都找到了這個必要的技巧。 – matt

+0

@matt我知道這已經很長時間了,但是你在最後一行錯過了一個右括號(它應該是「});」) – vib

-1

我遇到了同樣的NSInternalInconsistencyException異常。我的解決辦法如下:

textView.selectedTextRange = nil; // clear the selected text 
[textView resignFirstResponder]; 
-1

取出UITableViewCell從鍵盤隱藏UIKeyboardWillHideNotification通知載有UITextView時得到這個錯誤。

修復是邏輯進入UIKeyboardDidHideNotification

-1

我碰到這個問題時,我的方法是textFieldShouldEndEditing在某些情況下

-1

不會回來,我也經歷了同樣的問題。即使在調用「resignFirstResponer」和「endEditing」之後,它被發現崩潰了。

當我用@亞特的方法嘗試時,它工作正常。謝謝馬特。

這似乎是因爲我們將「deleteRowsAtIndexPaths:」添加到GCD隊列中,隊列將確保先前的任務在隊列中完成,然後只啓動main_queue中的下一個任務。因此不需要添加任何延遲。

0

我也面臨同樣的問題。而鍵盤是目前需要調用resignFirstResponder第一然後調用UITableview重載方法後執行

(void)textFieldDidEndEditing:(UITextField *)textField 

委託方法或內部:

(void)textFieldDidEndEditing:(UITextField *)textField{ 
    [tableview reloadData]; 
} 
1

我崩潰是從一個可編輯UIWebView一個UICollectionViewCell內。以下固定它:

[self.view endEditing:YES]

相關問題