在我的应用程序中有一个UITable。在表格单元格中,我在加载表格单元格时添加了UIStackView来填充。
在向下滚动表格之前工作正常。当我向上和向下滚动时,堆栈视图会添加更多元素。 (元素意味着UIButtons,我将来会用UIlabel替换它们)
我不知道如何解决这个问题。谢谢..
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
UIStackView *stkItems=(UIStackView *)[cell viewWithTag:8];
for(int i=0;i<5;i++) {
UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];
[btn setTitle:@"test btn" forState:UIControlStateNormal];
[stkItems addArrangedSubview:btn];
}
}
答案 0 :(得分:4)
表格视图重新单元格离开屏幕时。这就是您发送名为pip
的邮件的原因。你永远不会从堆栈视图中取出按钮。每次重复使用单元格时,都会向堆栈视图中已有的按钮添加五个按钮。
答案 1 :(得分:2)
我遇到了类似的问题,在表视图单元格中添加了arrangedSubviews
。
这里的窍门是,在单元格的prepareForResue
中,使用removeFromSuperview
从其超级视图中删除每个stackView的子视图,然后调用removeArrangedSubview
。
应该看起来像这样:
for view in self.views {
radioView.removeFromSuperview()
}
self.views.removeAll()
for arrangedSubview in self.stackView.arrangedSubviews {
self.stackView.removeArrangedSubview(arrangedSubview)
}
正如Apple documentation所说:
[
removeArrangedSubview
]方法不会删除提供的视图 从堆栈的子视图数组中;因此,视图仍然 显示为视图层次结构的一部分。
希望它将对某人有所帮助;)
答案 2 :(得分:1)
从该代码看来,每次你的应用程序需要绘制一个单元格时,它会向UIStackView添加按钮,所以当一个单元格被重用时(dequeueReusableCellWithIdentifier)它仍然包含按钮,但是你的代码不断添加更多时间。也许你应该检查UIStackView是否有足够的按钮或清除所有按钮并添加你需要的东西。
希望这有帮助
答案 3 :(得分:1)
我想我解决了它。但我不知道它是否符合标准。
这是更新的。 我已初始化并将其声明为0。
@implementation HistoryViewController
int data=0;
并像这样更改cellForRowAtIndexPath,以便它不会再次更新相同的stackview
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%ld",indexPath.row);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(data <=indexPath.row)
{
data=(int)indexPath.row;
UIStackView *stkItems=(UIStackView *)[cell viewWithTag:8];
[stkItems.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];
for(int i=0;i<5;i++) {
UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];
[btn setTitle:@"test btn" forState:UIControlStateNormal];
[stkItems addArrangedSubview:btn];
}
}
return cell;
}
答案 4 :(得分:0)
由于单元格正在重用UIStackView,因此您必须在添加新的子视图之前删除它们。要执行此操作,请在循环之前调用以下代码并将已排列的子视图添加到UIStackView:
Swift 3
for view in stackView.arrangedSubviews {
view.removeFromSuperview()
}
<强>目标C 强>
for (UIView *view in stackView.arrangedSubviews) {
[view removeFromSuperview];
}
*注意:如果你根据Apple的评论调用 [stackView removeArrangedSubview:view] ,它实际上并没有完全从接收器中删除它。见下面的引用:
- (void)removeArrangedSubview:(UIView *)视图 “从已排列的子视图列表中删除子视图,而不将其删除 接收器的子视图。 要将视图作为子视图删除,请像往常一样发送-removeFromSuperview; 相关的UIStackView将从其arrangeWeubviews列表中删除它 自动“。