2012-03-27 149 views
3

我在這裏有一個奇怪的問題。我有一個使用自定義UITableViewCells的UITableView。除特殊問題外,一切都按預期工作。當使用自定義UITableViewCell編輯之前更改UITextField文本

這裏的情景:

我需要刪除「$」符號爲UITextField編輯開始前的權利。這是通過textFieldShouldBeginEditing:方法完成的。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    LifeEarningsLineItemTableViewCell *cell = (LifeEarningsLineItemTableViewCell *)[self tableViewCellContainingObject:textField inTableView:self.lifeEarningsTableView]; 
    if (textField == cell.itemAmount) { 
     /*Remove currency symbol for editing.*/ 
     NSString *currencySymbol = [self.currencyFormatter currencySymbol]; 
     NSMutableString *mutableText = [NSMutableString stringWithString:textField.text]; 
     [mutableText replaceOccurrencesOfString:currencySymbol withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])]; 
     textField.text = mutableText; 
    } 

    return YES; 
} 

這裏的問題:

  • 之間不同行,從textField1會移動到文字欄(在不同行)中, 「$」 去除,這是GOOD
  • 相同行,從移動到textField1的文字欄位中, 「$」 刪除,這是BAD

爲什麼「$」不是在同一行內移除,而是在不同的行中移除?

這裏是問題的可視化表示:Issue

[編輯... ADDITION]
我得到這些日誌與這些流程:

Flow1
應該開始.....行:0,標籤:0
應該開始.....行:0,標記:1
DID END .....行:0,標記:0
DID END .....行:0 ,標籤:1

Flow2
應該開始.....行:0,標籤:0
應該開始.....行:1,標籤:1
DID END .....行:0,標籤:0
真的結束.....行:1,關鍵詞:1

而且,這裏是tableViewCellContainingObject:inTableView:tableView方法:

- (UITableViewCell *)tableViewCellContainingObject:(UIView *)view inTableView:(UITableView *)tableView { 
    CGPoint objectRectInTableViewCoordinates = [tableView convertPoint:view.bounds.origin fromView:view]; 
    NSIndexPath *cellIndexPath = [tableView indexPathForRowAtPoint:objectRectInTableViewCoordinates]; 
    return [tableView cellForRowAtIndexPath:cellIndexPath]; 
} 

而且textFieldDidEndEditing方法:

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    LifeEarningsLineItemTableViewCell *cell = (LifeEarningsLineItemTableViewCell *)[self tableViewCellContainingObject:textField inTableView:self.lifeEarningsTableView]; 
    LifeEarningsLineItem *lifeEarningsLineItem = [self.lifeEarningsFetchedResultsController objectAtIndexPath:[self.lifeEarningsTableView indexPathForCell:cell]]; 

    if (textField == cell.itemAmount) { 
     NSNumber *absInteger = [NSNumber numberWithInteger:abs([textField.text integerValue])]; 
     textField.text = [self.currencyFormatter stringFromNumber:absInteger]; 
     lifeEarningsLineItem.amount = absInteger; 
     [self sumAmountsAndDisplay]; 
    } else if (textField == cell.itemName) { 
     lifeEarningsLineItem.name = textField.text; 
    } 
} 
+0

那麼,它唯一可能的是由於某種原因(你不顯示代碼)'tableViewCellContainingObject:inTableView:'在這種情況發生時沒有返回正確的單元格。 – lnafziger 2012-03-27 20:13:34

+0

我通過'indexPathForCell:'通過日誌語句檢查過。它不僅記錄了正確的行,還通過'theTextField.text'爲這些UITextFields記錄了正確的值。從上面的代碼中,當我登錄'textField.text'時,它實際上記錄了正確的文本(沒有「$」)!然而,它在視覺上顯示「$」符號。僅供參考,這是通過模擬器(iOS 5.1)。 – Gobot 2012-03-27 20:35:07

+1

如果您記錄'textField.text'並顯示正確的值,是否有機會從另一行刪除$? – lnafziger 2012-03-27 20:56:14

回答

1

我認爲你的解決方案(在編輯過程中解耦FRC)可能有點激烈,可能會有不可預見的影響。這裏有幾個替代建議。我假設問題是由於在完成編輯單元格中的第一個字段後重新加載正在編輯的行所導致的。

  • 貨幣符號不要存放在你的模型,它添加到的cellForRowAtIndexPath顯示的文本,如果文本字段沒有編輯。當文本字段開始編輯時,將其文本直接從模型設置爲值。由於重新加載將爲您重新添加貨幣符號,因此您不必在結束編輯中進行任何操作。
  • 如果您不想更改模型,則可以執行類似的操作 - 在cellForRowAtIndexPath中刪除貨幣符號(如果單元格正在編輯)。
  • 存儲當前正在編輯的行的索引路徑,並有條件地忽略FRC委託方法中對此行的更改。
+0

具體是第一個要點。我已經將一個NSNumber存儲到我的模型中(即不保存$)。但是,如果**文本字段不是editing_「,則建議」將其添加到cellForRowAtIndexPath中顯示的文本中**「,如果**是一種很好的簡單方法。我完全忽略了這是一個檢查文本字段是否正在編輯的好地方。因此,在我的'configureCell'(在​​'cellForRowAtIndexPath'中調用),新編輯的行:'if(lifeEarningsLineItemCell.itemAmount.editing == NO)lifeEarningsLineItemCell.itemAmount.text = [self.currencyFormatter stringFromNumber:lifeEarningsLineItem.amount];'。謝謝。 – Gobot 2012-03-28 12:50:51

+0

樂意提供幫助。我知道整天盯着一個問題並錯過一個明顯的解決方案的感覺! – jrturton 2012-03-28 13:18:49

0

好的,我想通了這個問題......這是天才代織NSFetchedResultsController代表方法,特別是NSFetchedResultsChangeUpdate更改類型。這不是第一次NSFetchedResultsController走遍我的桌子。我應該記得NSFetchedResultsController不適合用戶驅動的編輯。

因此,這裏是我已經解決了這個問題(但我仍然擔心整個事情可能都來轟然倒下):

由於事件的順序...

SHOULD BEGIN.....Row:0, Tag:0 
SHOULD BEGIN.....Row:0, Tag:1 
DID END.....Row:0, Tag:0 
DID END.....Row:0, Tag:1 

...我不能只用一個BOOL屬性,說一個文本字段在編輯模式(事件的順序必須是BEGIN-> END-> BEGIN-> END)。

所以我創建的屬性:
@property (nonatomic, strong) NSMutableSet *stackOfEditingTextFields;

然後在textFieldShouldBeginEditing:方法開始時,我說:

/*Add text field to stack of editing text fields and disable the fetched results controller delegate.*/ 
[self.stackOfEditingTextFields addObject:textField]; 
self.lifeEarningsFetchedResultsController.delegate = nil; 
textFieldDidEndEditing:方法結束

於是,我說:

/*Remove text field from stack of editing text fields. If stack count is 0, reengage the fetched results controller delegate.*/ 
[self.stackOfEditingTextFields removeObject:textField]; 
if ([self.stackOfEditingTextFields count] == 0) self.lifeEarningsFetchedResultsController.delegate = self; 

如果有更好的建議或任何無法預料的副產品錯誤在我沒有看到的時候,我全都是耳朵。

感謝您的幫助lnafziger,幫助我解決問題,並提出不同的角度(我爲您的意見+1)。

+0

很高興你能解決這個問題,但我同意你對解決方案的關注。如果您在編輯過程中離開應用程序或切換到另一個選項卡,會發生什麼情況,鍵盤是否關閉,FRC代表會重新連接? – jrturton 2012-03-28 06:03:34

相關問題