您的解決方案感覺很奇怪。菲利普的權利,正確的方法是[wordsTableView reloadData]
,這將導致tableView:cellForRowAtIndexPath:
被稱爲每個可見的單元格。該方法在您滾動瀏覽表時也會調用,因此如果reloadData無法正常工作,您可能最終會遇到錯誤,並且數據在更改和滾動時無法正確更新。在你的clearValues方法中,你通過調用tableView:cellForRowAtIndexPath:
來做同樣的事情。
我認爲真正的問題在於tableView:cellForRowAtIndexPath:
的實現。該方法通常有2個部分。首先,創建或回收電池的東西,如獲得一個參考:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
}
內部的if語句通常是你應該添加子視圖到您的唯一的地方。如果dequeueReusableCellWithIdentifier:
返回一個單元格,它應該已經有子視圖。
然後,在if語句之後,填充或更新子視圖的內容。原始代碼的問題在於它填充文本字段並將其添加爲子視圖,假定單元格中沒有文本字段。所以,你的tableView:cellForRowAtIndexPath:
看起來應該更像是這樣的:
int textFieldTag = 100;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(158, 6, 148, 24)];
[textField setTag:textFieldTag];
[textField setDelegate:self];
[cell addSubview:textField];
[textField release];
}
UITextField *textField = [cell viewWithTag:textFieldTag];
NSString *strReplacement = [valueArray objectAtIndex:indexPath.row];
if (([strReplacement length] != 0) {
textField.text = strReplacement;
} else {
textField.placeholder = @"Add Value";
}
看起來你可以將文本框的標籤值被設定爲行號,想必這樣你就可以在UITextFieldDelegate使用它。這也可能導致錯誤,就像第1行的單元格被dequeueReusableCellWithIdentifier:
回收併成爲第12行一樣,它將具有意外的標記值。即使它現在沒有發生,它仍然是一個等待發生的錯誤,並且對於疑難解答將會非常棘手。
當我按下UIButton時,我清除了valueArray中的值(並且驗證了值被清除),但替換值仍然在reloadData之後填充UITextFields。 – 2011-03-28 15:59:46
這很奇怪。你可能想在'cellForRowAtIndexPath:'方法中放置一個斷點,並在'reloadData'後面查看'valueArray'的內容。 – filipe 2011-03-28 16:08:09
- (IBAction爲)clearReplacements:(ID)發送方{\t \t \t \t \t \t \t \t \t \t \t \t \t [self.valueArray removeAllObjects]; \t [myTableView reloadData]; \t }不重新加載表格。使用斷點代碼只是在reloadData之後停止。 – 2011-03-28 16:28:11