2008-12-17 53 views
24

在我的應用程序中,我在內有UITextField。如果我在文本字段內單擊並添加一些文本,我發現如果嘗試移動插入點,它將首次運行,但在後續嘗試中失敗。我完全無法移動選擇;沒有「放大鏡」出現。編輯UITableViewCell內的UITextField失敗

更奇怪的是,這個「設置」似乎是永久的,直到我重新啓動應用程序。它影響該屏幕上的所有UITextFields,而不僅僅是我最初嘗試編輯的那個。

如果您想自己查看,請嘗試使用iPhone SDK附帶的「UICatalog」示例。點擊「文本字段」,然後「編輯」,並使用文本框進行遊戲。

我已經做了很多挖掘,但對Google來說很難!我發現的最好的參考文獻是Apple's support boardMacRumors formum(兩者都提到了一個明顯用於iPhone 2.0的解決方案,但它不適用於當代版本 - 我嘗試過)。

我的感覺是這是操作系統中的一個錯誤,但我想我會把它扔給SO人羣以獲得第二個意見,並查看是否有任何解決方法。有任何想法嗎?

按照benzado的建議,我嘗試使用2.0,2.1和2.2 SDK構建我的應用程序。我在所有版本中都有相同的行爲。 (實際上,有些事情在2.2中突然出現,但這可能是另一個問題!)

回答

12

我花了很多時間在這個上,但我終於認爲我已經釘了。

訣竅是表格需要可編輯(即其editing屬性需要設置爲YES)。好消息是您現在可以移動插入點。有時放大鏡不會出現或跟隨,但您的手勢似乎總是工作。

這是否仍然有資格成爲bug?也許。至少Apple的SDK文檔應該被更新。我已經向Apple提出了一個錯誤報告來覆蓋這個(rdar:// 6462725)。

+0

哇,我剛剛注意到我的應用程序中存在同樣的問題。我試過了你的伎倆,現在它工作正常,謝謝! 此外,我不得不使tableView:canEditRowAtIndexPath:和tableView:canMoveRowAtIndexPath:返回NO,以便表看起來不像它處於編輯模式! – squelart 2008-12-30 23:53:55

0

它聽起來像是一個操作系統錯誤。我會嘗試通過針對2.0,2.1和2.2 SDK運行UICatalog示例來查看是否有任何更改。 (如果您爲2.2構建,則會出現與表格單元格文本對齊有關的錯誤,但如果您構建的是2.1,則無論設備上的操作系統版本如何,都會發生這種錯誤。)

如果它證明有所作爲,https://bugreport.apple.com/

+0

感謝您的建議。我一定會嘗試使用不同版本的SDK進行構建。我曾經假定它是運行代碼的操作系統版本,但當然我假設... – 2008-12-18 13:17:04

0

我試過這個與我的應用程序,它似乎按預期工作。我每次都會得到一個放大鏡。我正在使用2.1 SDK。

+0

有趣。那麼你如何使用UITableView,UITableViewCell和UITextField與UICatalog示例中的不同呢? – 2008-12-20 18:30:53

2

感謝這篇文章,我已經能夠成功地在我的應用程序中正常工作。

一些補充,但是:

如果您設置表爲可編輯,你可能會得到比你預期不同的行爲(縮進,編輯部件,沒有披露的指標等)。這讓我很吃驚,但這裏是如何最好地處理它:

在你的UITableView委託,執行:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

然後,在你的UITableViewCell的實施,將您的UITableView爲可編輯只有當你真正編輯:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    ((UITableView *)[self superview]).editing = YES; 
... 
} 

,並在完成編輯後禁止編輯:

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
... 
    ((UITableView *)[self superview]).editing = YES; 
} 

當你不編輯單元格時,這可以確保你的表格不處於編輯模式,讓事情順利進行。

謝謝!

布賴恩M. Criscuolo 馬克/太空公司

2

由Brian M. Criscuolo答案是最接近的,但它仍然沒有完全正確的 - 在我的SDK2.2.1的使用我發現我必須做以下內容:

爲了您的UITableViewDelegate(這往往是你的UITableViewController)添加以下兩項:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

和:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewCellEditingStyleNone; 
} 

和:

- (void)viewDidLoad { 
[super viewDidLoad]; 

    // do any other customisation here 
self.uiTableView.editing = true; 
} 

如果你不把上面兩個委託方法,以上將導致刪除圖標旁邊的每一行,每一行的縮進。

您應該不需要像Brian所指出的那樣對文本字段代理執行任何操作(除非您有多行並且您想要響應didSelectRowAtIndexPath:事件 - 在編輯模式下您似乎沒有這樣做),那麼您也需要按照他的建議去做)。

順便說一句 - 這似乎是固定的SDK3.0(雖然如有變更,我猜)

0

其實什麼效果最好似乎是設置表「編輯」屬性爲true「viewDidLoad中」和增加這些表代表

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

你不需要在文本字段委託做任何事情