2013-02-18 26 views
0

我最近發現在UITableView中發現了一些有關選擇和取消選擇功能的有趣錯誤。 (m.b.它本身並不是一個bug,但是我覺得這種情況非常嚴重)。帶有canBecomeFirstResponder的自定義UITableViewCell YES在屏幕外不會取消選擇

史前史:我試圖創建一些自定義的TableViewCell類,它將能夠使用UIDatePicker選擇一些日期並將其放置在單元格的標籤中。 "CellDate" sample對我來說不是很好。所以我試圖設置一些自定義inputView到單元格,並使其成爲第一響應者。經過一段時間的研究,我發現了重寫我的自定義UITableViewCell子類的只讀inputView屬性的方法,現在它完美地工作:當單元格被選中時,我打電話給[self becomeFirstResponder],當單元格被取消選中時,我打電話[self resignFirstResponder],所以它工作得很好,但有一些錯誤。

當我在屏幕上我的自定義單元格(即不滾出關閉屏幕)一切是正確的,但如果我選擇它

Selecting custom cell

滾動的tableView下來,我的手機不再是屏幕

Scrolled down, custom cells are no longer on screen

,然後選擇一些其他小區

Selecting some other cell while custom cell is no longer on screen

我的自定義單元格將不會被取消

Unexcpected result

在默認情況下的UITableViewCell的功能,唯一的主要變化是:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 

    if (selected) 
    { 
     [self becomeFirstResponder]; 
    } 
    else 
    { 
     [self resignFirstResponder]; 
    } 
} 

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

僅使用此方法重寫使得這個錯誤出現:噹噹前選定的自定義單元格是屏幕外也不會取消的某些原因。

我的問題是:有沒有人經歷過這樣的事情,有什麼我可以做的嗎?因爲除此之外,我對日期單元格的問題有一個完美的解決方案。

這是不是一個正確的方式來使用UITableViewCells?我在做一些完全錯誤的事情嗎?我剛剛開始學習iOS,所以我可能不太熟悉它的某些方面。

P.S.對不起我的壞語言,我不是以英語爲母語的人。

更新:

我已經找到了一些更多的細節。經過一番研究後,我發現,當你滾動tableView並隱藏某個tableViewCell離屏時,它的(cell)被破壞。當你回滾它時,通過調用tableView的委託tableView再次創建它:cellForRowAtIndexPath: 除此之外,如果您嘗試調用[tableView cellForRowAtIndexPath:indexPath]作爲indexPath的行,這是屏幕外,tableView將返回給你一個零。

但奇怪的是:當你的自定義單元格是firstResponder,顯然,它不會通過tableView的委託tableView:cellForRowAtIndexPath重新創建:它不會通過[tableView cellForRowAtIndexPath:indexPath]來訪問。

至於我,這很奇怪。

回答

0

我自己找到解決方案。當其他行被選中時,它看起來像退出第一響應者一樣簡單。順便說一句,我用this answer來完成這個。

希望它能幫助別人。

0

要直接回答這個問題,UITableView不會取消它自己的單元格。在您的TableView控制器中,您需要覆蓋-(void)tableView:(UITableView *)tableView didselectRowAtIndexPath:(NSIndexPath *)indexPath並手動取消選擇所選單元格。

-(void)tableView:(UITableView *)tableView didselectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animate:YES]; 
} 

在你的UITableViewCell的子類,你應該爲你的細胞過渡到可編輯狀態覆蓋-(void)setEditing:(BOOL)editing animated:(BOOL)animated(道歉編輯,我在回答無意中救了)。 (設置你的UITextField爲可編輯),然後在你的單元格中,你會讓你的文本框成爲/退出第一響應者。

當某件東西可編輯時,第一響應者用於成爲響應鍵盤的下一個對象。

例如,如果您有單元格c1和單元格c2。 c1和c2都有UITextFields。您在c1中,並且您希望鍵盤上的Return按鈕將文本光標移動到c2中,然後在c1時需要使UITextField作爲第一響應者辭職,並告訴c2使其UITextField成爲第一響應者。 你可以通過將自定義單元格作爲它的UITextField的委託來實現這一點,然後實現-(BOOL)textFieldShouldReturn:(UITextField *)textField以使textField作爲第一響應者辭職,然後告訴你的UITableView控制器告訴下一個單元格使其文本字段成爲第一響應者。

+0

感謝您的回答。 正如我所看到的,默認的tableView行爲是在選擇其他單元格時取消選擇之前選定的單元格。我會嘗試重寫tableView:didSelectRowAtIndexPath :,但在我看來,像默認行爲已損壞。 – DemoniacDeath 2013-02-20 08:30:43

+0

另外,我真的不得不使用UITextField?這實際上並不是我想要使用的,因爲我的單元格中沒有文本字段,整個單元格是一個控制元素,根據所選日期更改其標籤內容。而且我也不想編輯UITableViewCell的狀態,因爲cell不會改變它的狀態。我現在唯一需要的是選擇/取消單元格的正確工作 – DemoniacDeath 2013-02-20 08:36:15

+0

好像我已經找到更多的細節,我會更新問題 – DemoniacDeath 2013-02-20 09:24:51

相關問題