在UITable滚动时自动将UI元素添加到UIStackView

时间:2016-04-19 15:07:33

标签: ios objective-c uitableview uistackview

在我的应用程序中有一个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];
    }
}

5 个答案:

答案 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列表中删除它        自动“。