我最近發現在UITableView中發現了一些有關選擇和取消選擇功能的有趣錯誤。 (m.b.它本身並不是一個bug,但是我覺得這種情況非常嚴重)。帶有canBecomeFirstResponder的自定義UITableViewCell YES在屏幕外不會取消選擇
史前史:我試圖創建一些自定義的TableViewCell類,它將能夠使用UIDatePicker選擇一些日期並將其放置在單元格的標籤中。 "CellDate" sample對我來說不是很好。所以我試圖設置一些自定義inputView到單元格,並使其成爲第一響應者。經過一段時間的研究,我發現了重寫我的自定義UITableViewCell子類的只讀inputView屬性的方法,現在它完美地工作:當單元格被選中時,我打電話給[self becomeFirstResponder]
,當單元格被取消選中時,我打電話[self resignFirstResponder]
,所以它工作得很好,但有一些錯誤。
當我在屏幕上我的自定義單元格(即不滾出關閉屏幕)一切是正確的,但如果我選擇它
滾動的tableView下來,我的手機不再是屏幕
,然後選擇一些其他小區
我的自定義單元格將不會被取消
。
在默認情況下的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]來訪問。
至於我,這很奇怪。
感謝您的回答。 正如我所看到的,默認的tableView行爲是在選擇其他單元格時取消選擇之前選定的單元格。我會嘗試重寫tableView:didSelectRowAtIndexPath :,但在我看來,像默認行爲已損壞。 – DemoniacDeath 2013-02-20 08:30:43
另外,我真的不得不使用UITextField?這實際上並不是我想要使用的,因爲我的單元格中沒有文本字段,整個單元格是一個控制元素,根據所選日期更改其標籤內容。而且我也不想編輯UITableViewCell的狀態,因爲cell不會改變它的狀態。我現在唯一需要的是選擇/取消單元格的正確工作 – DemoniacDeath 2013-02-20 08:36:15
好像我已經找到更多的細節,我會更新問題 – DemoniacDeath 2013-02-20 09:24:51