我有一个iPhone应用程序,它有一个基于表格视图的数据输入屏幕,带有一个切换,当打开时显示表格另一部分的所有行。
有时,当应用程序首次加载时,通常从手机中完全删除后,除了新行之外,还会显示表格原始部分的UITextFields,如下所示(主表部分在上方)
:
关于这一点最奇怪的是这种行为只在第一次出现这个屏幕时才出现 - 之后似乎很好。哦,它似乎只出现在手机上,而不是模拟器上。
鉴于此的随机性,它是否与其他应用程序有关?我确实有同时运行类似命名空间的应用程序。我关闭应用程序/从手机中删除后,问题似乎消失了。
我已经包含了在下面更改开关时运行的代码块:
- (void)accountSwitchChanged {
[customerDetails saveField:@"addToAccount" WithBool:addToAccountSwitch.on];
NSArray *indexes = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:1 inSection:1], [NSIndexPath indexPathForRow:2 inSection:1], [NSIndexPath indexPathForRow:3 inSection:1],nil];
if (addToAccountSwitch.on)
[detailsTable insertRowsAtIndexPaths:indexes withRowAnimation:UITableViewRowAnimationFade];
else
[detailsTable deleteRowsAtIndexPaths:indexes withRowAnimation:UITableViewRowAnimationFade];
}
有什么想法吗?
- 修改
cellForRowAtIndexPath代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// get rid of grey background for iPad app
[tableView setBackgroundView:nil];
UITableViewCell *cell = nil;
NSDictionary *cellData = [[dataSourceArray objectAtIndex: indexPath.section] objectAtIndex:indexPath.row];
id cellControl = [cellData objectForKey:kCellControlKey];
static NSString *kCellControl = @"CellControl";
cell = [tableView dequeueReusableCellWithIdentifier:kCellControl];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellControl] autorelease];
cell.textLabel.textColor = [[[ConfigManager sharedInstance].skin valueForKey:@"tableCellHeadingTextColour"] toUIColor];
cell.backgroundColor = [[[ConfigManager sharedInstance].skin valueForKey:@"tableCellBgColour"] toUIColor];
cell.textLabel.font = [UIFont boldSystemFontOfSize:17];
} else {
// a cell is being recycled, remove the old control (if it contains one of our tagged edit fields)
UIView *viewToCheck = nil;
viewToCheck = [cell.contentView viewWithTag:kDetailsViewTag];
if (!viewToCheck)
[viewToCheck removeFromSuperview];
}
// if control is not a text field, make it a button
if (![cellControl isKindOfClass:[UITextField class]])
cell.selectionStyle = UITableViewCellSelectionStyleGray;
else
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = [cellData objectForKey:kCellTitleKey];
[cell.contentView addSubview:cellControl];
return cell;
}
答案 0 :(得分:1)
需要检查和消除的东西如果只是在第一次显示视图时发生,那么在您开始工作之前,总是值得检查您是否认为视图已加载。这并不经常出现,但是当它发生时,很难追踪到。要检查这是否是您的问题,请在首次创建视图后添加[viewController视图]调用。这会强制加载视图。如果在添加此问题时问题就消失了,您就已经跟踪了问题的根源。您甚至可以将[viewController视图]调用作为修复,或者通过代码来实现惰性实例化。
所有这些说明,更有可能是你的tableView中的一些有趣的东西:cellForRowAtIndexPath:代码。如果你想要好的堆栈溢出,请发布该代码的所有或相关片段(或它调用的相关代码)。
发布的代码跟进:
(1)if (!viewToCheck) [viewToCheck removeFromSuperview]
无法做任何事情。它只会在viewToCheck为零时发送removeFromSuperview消息,并且不会做任何事情。不确定这是否是关键问题,但这是正确的事情。
(2)[cell.contentView addSubview:cellControl];
- 这看起来有问题 - 通常最好只在创建单元格时添加子视图。你可以在tableView的主体中隐藏或显示:cellForRowAtIndexPath: - 我怀疑,这对你有用。使用此代码存在风险,您只需添加多个子视图,当您只需要一个或(这可能是此处发生的事情)时,您最终不会删除子视图被回收。如果viewToCheck
代码应该删除添加的cellControl,那么,如果(1),它不会立即这样做,因为你的if条件是错误的。