Xcode 添加新的 TableView 单元格会添加新单元格,但会显示已删除单元格的文本字段
Xcode adding new TableView cell adds new cell but shows deleted cell's textfield
我有一个显示单元格的表格视图。必须使用切换按钮删除其中一些单元格,然后再添加一些单元格。
所以我的第 3 部分有 4 个单元格。它们的标题按升序排列如下:相同?、开始、结束、持续时间。我列表中的第二个和第三个单元格的文本字段为 accesoryViews
,当切换按钮(位于顶部单元格)关闭时,这些文本字段都会被删除。所以这给我留下了 2 个单元格:相同吗?和持续时间在我的第三部分。
如果我按下一个按钮,它会将 2 个单元格添加到同一部分(第 3 部分),但由于某种原因,它们将 2 个单元格中的文本字段作为其附属视图删除。
我的代码如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"creatures"];
if (nil == cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"creatures"];
}
switch (indexPath.section)
{
case 0:
break;
case 1:
break;
case 2:
cell.textLabel.text = [timesTitles objectAtIndex:indexPath.row];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if (indexPath.row == 0) {
sameTimeEverydaySwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
[sameTimeEverydaySwitch setOn:YES];
[sameTimeEverydaySwitch addTarget:self action:@selector(sameEverydaySwitchChanged) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = sameTimeEverydaySwitch;
}
if ([[timesTitles objectAtIndex:indexPath.row] isEqualToString:@"Start time:"]) {
cell.accessoryView = startTimeTextfield;
NSLog(@"log");
}
if ([[timesTitles objectAtIndex:indexPath.row] isEqualToString:@"End time:"]) {
cell.accessoryView = endTimeTextfield;
NSLog(@"log2");
}
if ([[timesTitles objectAtIndex:indexPath.row] isEqualToString:@"Meeting duration"]) {
cell.accessoryView = meetingDurationTextfield;
}
break;
default:
cell.textLabel.text = @"Not Found";
}
return cell;
}
当按钮被切换时,我调用:
if (![sameTimeEverydaySwitch isOn]) {
for (int j = 0; j < timesTitles.count; j++) {
if ([[timesTitles objectAtIndex:j] isEqualToString:@"Start time:"]) {
[timesTitles removeObjectAtIndex:j];
}
if ([[timesTitles objectAtIndex:j] isEqualToString:@"End time:"]) {
[timesTitles removeObjectAtIndex:j];
}
}
[timesTitles addObjectsFromArray:daysToAddToTitlesArray];
NSArray *deleteIndexPaths = [NSArray arrayWithObjects:
[NSIndexPath indexPathForRow:2 inSection:2],
[NSIndexPath indexPathForRow:1 inSection:2],
nil];
NSMutableArray *insertIndexPaths = [[NSMutableArray alloc] init];
for (int i = 2; i < [timesTitles count]; i++) {
NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:2];
[insertIndexPaths addObject:path];
}
UITableView *tv = (UITableView *)self.view;
[tv beginUpdates];
[tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];
[tv deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[tv endUpdates];
}
此代码成功删除了中间的 2 个单元格。
当我使用以下方法在剩余 2 个单元格下方添加 2 个新单元格时:
for (int i = 0; i < daysToAddToTitlesArray.count; i++) {
if (![timesTitles containsObject:[daysToAddToTitlesArray objectAtIndex:i]]) {
NSIndexPath *path = [NSIndexPath indexPathForRow:[timesTitles count] inSection:2];
[timesTitles insertObject:[daysToAddToTitlesArray objectAtIndex:i] atIndex:[timesTitles count]];
[insertIndexPaths addObject:path];
}
}
UITableView *tv = (UITableView *)self.view;
[tv beginUpdates];
[tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];
[tv endUpdates];
它成功添加了下面的 2 个新单元格,但它们中没有文本字段。
我 运行 应用程序的唯一输出是:log 和 log2。
我很困惑。
希望您熟悉可重复使用电池的概念。 (如果你不是,请检查 this)
在您的代码中,我可以看到仅当其中一个条件为真时才设置 cell.accessoryView
,否则它会从可重复使用的单元格中获取附件。
检查数组和索引中的标题(使用调试模式)
马尔科
我有一个显示单元格的表格视图。必须使用切换按钮删除其中一些单元格,然后再添加一些单元格。
所以我的第 3 部分有 4 个单元格。它们的标题按升序排列如下:相同?、开始、结束、持续时间。我列表中的第二个和第三个单元格的文本字段为 accesoryViews
,当切换按钮(位于顶部单元格)关闭时,这些文本字段都会被删除。所以这给我留下了 2 个单元格:相同吗?和持续时间在我的第三部分。
如果我按下一个按钮,它会将 2 个单元格添加到同一部分(第 3 部分),但由于某种原因,它们将 2 个单元格中的文本字段作为其附属视图删除。
我的代码如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"creatures"];
if (nil == cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"creatures"];
}
switch (indexPath.section)
{
case 0:
break;
case 1:
break;
case 2:
cell.textLabel.text = [timesTitles objectAtIndex:indexPath.row];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if (indexPath.row == 0) {
sameTimeEverydaySwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
[sameTimeEverydaySwitch setOn:YES];
[sameTimeEverydaySwitch addTarget:self action:@selector(sameEverydaySwitchChanged) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = sameTimeEverydaySwitch;
}
if ([[timesTitles objectAtIndex:indexPath.row] isEqualToString:@"Start time:"]) {
cell.accessoryView = startTimeTextfield;
NSLog(@"log");
}
if ([[timesTitles objectAtIndex:indexPath.row] isEqualToString:@"End time:"]) {
cell.accessoryView = endTimeTextfield;
NSLog(@"log2");
}
if ([[timesTitles objectAtIndex:indexPath.row] isEqualToString:@"Meeting duration"]) {
cell.accessoryView = meetingDurationTextfield;
}
break;
default:
cell.textLabel.text = @"Not Found";
}
return cell;
}
当按钮被切换时,我调用:
if (![sameTimeEverydaySwitch isOn]) {
for (int j = 0; j < timesTitles.count; j++) {
if ([[timesTitles objectAtIndex:j] isEqualToString:@"Start time:"]) {
[timesTitles removeObjectAtIndex:j];
}
if ([[timesTitles objectAtIndex:j] isEqualToString:@"End time:"]) {
[timesTitles removeObjectAtIndex:j];
}
}
[timesTitles addObjectsFromArray:daysToAddToTitlesArray];
NSArray *deleteIndexPaths = [NSArray arrayWithObjects:
[NSIndexPath indexPathForRow:2 inSection:2],
[NSIndexPath indexPathForRow:1 inSection:2],
nil];
NSMutableArray *insertIndexPaths = [[NSMutableArray alloc] init];
for (int i = 2; i < [timesTitles count]; i++) {
NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:2];
[insertIndexPaths addObject:path];
}
UITableView *tv = (UITableView *)self.view;
[tv beginUpdates];
[tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];
[tv deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[tv endUpdates];
}
此代码成功删除了中间的 2 个单元格。
当我使用以下方法在剩余 2 个单元格下方添加 2 个新单元格时:
for (int i = 0; i < daysToAddToTitlesArray.count; i++) {
if (![timesTitles containsObject:[daysToAddToTitlesArray objectAtIndex:i]]) {
NSIndexPath *path = [NSIndexPath indexPathForRow:[timesTitles count] inSection:2];
[timesTitles insertObject:[daysToAddToTitlesArray objectAtIndex:i] atIndex:[timesTitles count]];
[insertIndexPaths addObject:path];
}
}
UITableView *tv = (UITableView *)self.view;
[tv beginUpdates];
[tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];
[tv endUpdates];
它成功添加了下面的 2 个新单元格,但它们中没有文本字段。
我 运行 应用程序的唯一输出是:log 和 log2。
我很困惑。
希望您熟悉可重复使用电池的概念。 (如果你不是,请检查 this)
在您的代码中,我可以看到仅当其中一个条件为真时才设置 cell.accessoryView
,否则它会从可重复使用的单元格中获取附件。
检查数组和索引中的标题(使用调试模式)
马尔科