我有一个UITableView
可重新排序的行,我正在使用标准UITableViewCell.text
属性来显示文本.当我点击编辑,移动一行,点击完成,然后点击该行,内置UILabel
转为完全白色(文本和背景)和不透明,并且单元格的蓝色阴影不显示在它后面.是什么赋予了?有什么我应该做的,我不是吗?我有一个hacky修复,但我想要真正的McCoy.
以下是如何重现它:
从iPhone OS 2.2.1 SDK中的标准"基于导航的应用程序"模板开始:
打开RootViewController.m
取消注释viewDidLoad
,然后启用"编辑"按钮:
- (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. self.navigationItem.rightBarButtonItem = self.editButtonItem; }
指定表有几个单元格:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 4; }
在tableView:cellForRowAtIndexPath:
,添加一行来设置单元格的文本属性,因此使用内置的UILabel子视图:
// Set up the cell... cell.text = @"Test";
要启用重新排序,请取消注释tableView:moveRowAtIndexPath:toIndexPath:
.默认实现是空白的,在这种情况下很好,因为模板不包含数据模型.
为Simulator,OS 2.2.1,Build and Go配置项目.当应用程序出现时,点击编辑,然后将任意行滑动到新位置,点击完成,然后一次点击一行.通常,点击将选择一行,将其变为蓝色,并将其文本变为白色.但是,您刚刚移动的行上的点按就可以实现,并将 UILabel的背景颜色保留为白色.结果是一个令人困惑的白色开放空间,边缘有蓝色条纹.奇怪的是,在第一次虚假敲击后,另一个水龙头似乎可以解决问题.
到目前为止,我已经找到了修复它的黑客,但我对此并不满意.它的工作原理是确保内置UILabel
是非不透明的,并且在选择后立即没有背景颜色.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // hacky bugfix: when a row is reordered and then selected, the UILabel displays all crappy UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; for (UIView *view in cell.contentView.subviews) { if ([[view class] isSubclassOfClass:[UILabel class]]) { ((UILabel *) view).backgroundColor = nil; view.opaque = NO; } } // regular stuff: only flash the selection, don't leave it blue forever [tableView deselectRowAtIndexPath:indexPath animated:YES]; }
这似乎有效,但我不认为它永远是个好主意.解决这个问题的正确方法是什么?
这看起来像是UITableView渲染中的一个错误,你应该在其上提交一个Radar错误报告.就像移动后细胞不能正常刷新一样.
现在解决这个问题的一种方法是不使用内置标签,而是在单元格中滚动自己的标签:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; CGRect frame = cell.contentView.bounds; frame.origin.x = frame.origin.x + 10.0f; UILabel *textLabel = [[UILabel alloc] initWithFrame:frame]; [textLabel setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin]; textLabel.tag = 1; textLabel.textAlignment = UITextAlignmentLeft; textLabel.backgroundColor = [UIColor clearColor]; textLabel.textColor = [UIColor blackColor]; textLabel.font = [UIFont boldSystemFontOfSize:20.0]; textLabel.numberOfLines = 1; textLabel.highlightedTextColor = [UIColor whiteColor]; [cell.contentView addSubview:textLabel]; [textLabel release]; } UILabel *textLabel = (UILabel *)[cell viewWithTag:1]; textLabel.text = @"Test"; return cell; }
我试过这个,并没有展示你用内置标签看到的那种白色空白矩形.但是,向表格单元格添加另一个非不透明视图可能不是最佳的整体渲染性能.
我不知道这有多重要,因为Apple不希望你在表格行上坚持选择亮点(他们最近在审核过程中一直强制执行).您应该选中一个复选标记或移动到导航层次结构中的下一个级别,此时此白框只会在屏幕上显示一小段时间.