- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经为此苦苦挣扎了一个星期,我的脑袋快要爆炸了。
基本上我使用 Prototype Cell,在 CellWillAppear 中我做了一些定制,比如背景颜色。没有什么花哨。
因此,我的 TableView 在启动时总是空的(没有单元格),除非数组(数据源)被填充了一些东西。所以我所做的是在 NumberOfRowsInSection 中:
return dataArray.count < 10? 10 : dataArray.count
我这样做是因为我希望在没有数据时至少看到一些空单元格。这意味着它将在启动时显示至少 10 个空单元格。
为了将数据添加到单元格,我每次都在我的 tableviewcontroller 中调用委托(delegate)方法,以在数据数组中添加一个实体(我这样做,因为我认为这比等到整个数组都完成要快填充后调用 [self.tableView reloadData];) 然后使用 reloadRowsAtIndexPaths 刷新它。但是当它到达索引 10 时它每次都崩溃(错误:......在更新数据之前是 10,但在更新之后是 11)。
我真正想要的是:
1.) 准备一些数据
2.) 将它发送到 uitableview Controller 并将其添加到那里的数组,而不是等待然后将整个数组发送到 TableView 并立即刷新。
3.) 更新后仅重新加载一行(而不是使用 reloadData -> 因为我有不同颜色的单元格,整个重新加载导致我的 TableView 疯狂闪烁)。
我对单元格自定义所做的一件事是在 willDisplayCell 中:我在那里所做的是改变单元格的背景颜色。再一次,没什么特别的。但是因为启动时没有数据,所以没有单元格是可见的(ui tablew 根本没有显示单元格),除非我这样做
return dataArray.count < 10? 10 : dataArray.count;
至少有 10 个空单元格显示(为什么我必须执行上述操作才能显示一些自定义的空单元格,这让我很困惑...)。
使用reloadData是刷新没问题,但是由于我是在每次数据准备好时更新 TableView 中的数据源数组,而不是将所有准备好的数据保存到这个数组中,然后将其发送到 TableView 中使用reloadData进行更新,我想逐行更新。
我觉得错误来自这样一个事实:如果我在数组中添加一项然后调用 reloadRowsAtIndexPath,它会说“好的,你之前有一项,但更新后有 2 项!不一致。 ”
我已经尝试使用 [tableView beginUpdate]; and [tableView endUpdate];
到目前为止没有任何效果......
所以总结一下:即使数据数组在启动时为空,我如何才能显示不同颜色的单元格(就像默认的 ui TableView ,即使没有数据也完全显示单元格)并仅更新其中一个一条数据准备好后的单元格,而不是使用 reloadData 更新整个 ui TableView ?
非常感谢,请指教。问候。
最佳答案
“即使数据数组为空,我怎样才能显示不同颜色的单元格”
不要有一个空数组,有一个可变数组,其中所有成员最初都是空字符串,并在您获得它时用您的真实数据替换它们。
“一旦一条数据准备就绪,只更新其中一个单元格”
用新数据更新数组,然后使用 reloadRowsAtIndexPaths:withRowAnimation: 更新表。如果你想看到表逐行更新(慢到可以看到),那么首先将你的数据放在一个临时数组中,然后使用 performSelector:withObject:afterDelay: 一次添加一个元素,调用 reloadRowsAtIndexPaths:withRowAnimation: 之后每次添加。
很难准确地说出您想要什么,但这里有一个例子可以说明我的意思。此表显示 20 个空行,所有行都具有不同的颜色,持续 2 秒,然后以每秒 10 个的速率将 displayData 中的空字符串替换为 theData 中的字符串。
@interface TableController ()
@property (strong,nonatomic) NSArray *theData;
@property (strong,nonatomic) NSMutableArray *displayData;
@end
@implementation TableController
- (void)viewDidLoad {
[super viewDidLoad];
self.displayData = [@[@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@"",@""] mutableCopy];
self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight",@"Nine",@"ten",@"Black",@"Brown",@"Red",@"Orange",@"Yellow",@"Green",@"Blue",@"Violet",@"Gray",@"White"];
[self.tableView reloadData];
[self performSelector:@selector(addData) withObject:nil afterDelay:2];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.displayData.count;
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
UIColor *cellTint = [UIColor colorWithHue:indexPath.row * .05 saturation:1.0 brightness:1.0 alpha:1.0];
cell.backgroundColor = cellTint;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = self.displayData[indexPath.row];
return cell;
}
-(void)addData {
static int i = 0;
[self.displayData replaceObjectAtIndex:i withObject:self.theData[i]];
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
i++;
if (i < self.displayData.count) [self performSelector:@selector(addData) withObject:nil afterDelay:.1];
}
如果您不希望行更新之间有任何延迟,并且您希望在 displayArray 具有与 theData 不同的行数时使其工作,则此版本的 addData 应该可以工作:
-(void)addData {
static int i = 0;
if (i < self.displayData.count && i< self.theData.count) {
[self.displayData replaceObjectAtIndex:i withObject:self.theData[i]];
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
i++;
[self addData];
}else if (i >= self.displayData.count && i< self.theData.count) {
[self.displayData addObject:self.theData[i]];
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
i++;
[self addData];
}
}
关于iOS:逐行添加/更新 UITableView 单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972948/
我已经尝试在我的 CSS 中添加一个元素来删除每三个 div 的 margin-right。不过,似乎只是出于某种原因影响了第 3 次和第 7 次。需要它在第 3、6、9 等日工作... CSS .s
如何使 div/input 闪烁或“脉冲”?例如,假设表单字段输入了无效值? 最佳答案 使用 CSS3 类似 on this page ,您可以将脉冲效果添加到名为 error 的类中: @-webk
我目前正在尝试构建一个简单的 wireframe来自 lattice 的情节包,但由沿 y 轴的数百个点组成。这导致绘图被线框网格淹没,您看到的只是一个黑色块。我知道我可以用 col=FALSE 完全
在知道 parent>div CSS 选择器在 IE 中无法识别后,我重新编码我的 CSS 样式,例如: div#bodyMain div#paneLeft>div{/*styles here*/}
我有两个 div,一个在另一个里面。当我将鼠标悬停 到最外面的那个时,我想改变它的颜色,没问题。但是,当我将鼠标悬停 到内部时,我只想更改它的颜色。这可能吗?换句话说,当 将鼠标悬停到内部 div 上
我需要展示这样的东西 有人可以帮忙吗?我可以实现以下输出 我正在使用以下代码:: GridView.builder( scrollDirection: Axis.vertical,
当 Bottom Sheet 像 Android 键盘一样打开时,是否有任何方法可以手动上推布局( ScrollView 或回收器 View 或整个 Activity )?或者你可以说我想以 Bott
我有以下代码,用于使用纯 HTML 和 CSS 显示翻转。当您将鼠标悬停在文本上时,它会更改左右图像。 在我测试的所有浏览器中都运行良好,Safari 4 除外。据我收集的信息,Safari 4 支持
我构建了某种 CMS,但在使用 TinyMCE 和 Bootstrap 时遇到了一些问题。 我有一个页面,其中概述了一个 div,如果用户单击该 div,他们可以从模态中选择图像。该图像被插入到一个
出于某种原因,当我设置一个过渡时,当我的鼠标悬停在一个元素上时,背景会改变颜色,它只适用于一个元素,但它们都共享同一个类?任何帮助我的 CSS .outer_ad { position:rel
好吧,这真的很愚蠢。我不知道 Android Studio 中的调试监视框架发生了什么。我有 1.5.1 的工作室。 是否有一些来自 intellij 的 secret 知识来展示它。 最佳答案 与以
我有这个标记: some code > 我正在尝试获取此布局: 注意:上一个和下一个按钮靠近#player 我正在尝试这样: .nextBtn{
网站:http://avuedesigns.com/index 首页有 6 个菜单项。我希望每件元素在您经过时都有自己的颜色。 这是当您将鼠标悬停在 div 上时将所有内容更改为白色的行 li#hom
我需要在 index.php 文件中显示它,但没有任何效果。我所有的文章都没有正确定位。我将其用作代码: 最佳答案 您可以首先检查您
我是一名优秀的程序员,十分优秀!