动态生成按钮时应用程序运行缓慢

Posted

技术标签:

【中文标题】动态生成按钮时应用程序运行缓慢【英文标题】:app is moving slow when dynamically generating buttons 【发布时间】:2015-12-16 22:20:43 【问题描述】:

我想为 ios 构建一个新闻应用程序,其中每篇文章都被分成类别并显示在表格视图中。因此,如果一篇文章有​​ 2 个类别(例如:编码和编程),那么显示这篇文章的单元格也应该有 2 个按钮,每个类别一个。如果我添加没有文本的按钮,那么表格视图效果很好。但是,如果我为按钮添加标题,那么在滚动几次之后,应用程序就会开始滞后。

这是生成按钮的代码:

func createHashtagButtonsWith(var categories categories: Array<JSON>, cell: ExploreTableViewCell)


    var x: CGFloat = 0;
    var y: CGFloat = 0;
    for( var i = 0; i < hashtags.count; i++)
        let size = categories[i].stringValue.sizeWithAttributes([NSFontAttributeName: UIFont.systemFontOfSize(13.0)]);

        if (x + size.width + 16 > cell.categoryView.frame.size.width)
            x = 0;
            y = size.height + 10;
            cell.categoryView.frame.size.height = cell.categoryView.frame.size.height + size.height + 12;
        

        let categoryButton : UIButton = UIButton(frame: CGRect(x: x, y: y, width: size.width + 16, height: size.height + 8));
       categoryButton.setTitle("\(categories[i].stringValue)", forState: .Normal);
        categoryButton.backgroundColor = UIColor.flatBlueColorDark();
        categoryButton.layer.masksToBounds = true;
        categoryButton.layer.cornerRadius = 3;

        cell.categoryView.addSubview(categoryButton);
        x += size.width + 24;
    

我从 tableView willDisplayCell 调用这个方法

我还使用了这篇 perfect smooth scrolling in uitableviews 文章中的一些技巧来增强表格视图

知道为什么当我向按钮添加标题时应用程序开始滞后吗?

【问题讨论】:

【参考方案1】:

如果您在willDisplayCell 中调用此代码,则在重复使用这两个按钮时,您会一次又一次地将它们添加到相同的单元格中,因此在滚动几次之后,每个单元格中就会有数十个按钮。

在单元格本身中创建按钮(在awakeFromNib 左右)以避免这种情况。

【讨论】:

谢谢,我这几天一直在做这个。你能告诉我如何在调用 awakeFromNib 之前实例化一个单元格属性吗?基本上我从服务器接收类别,我需要在单元格对象中发送类别数组。再次感谢。 你不需要在 awakeFromNib 之前设置它,那是为了初始化单元格的 UI - 在 ViewController 中将数据与单元格分开,然后设置数据为将在 cellForRowAtIndexPath 函数中显示在该行的单元格中的右行。 如果我这样做,我怎么知道我需要在单元格中添加多少按钮?按钮的数量可能因文章而异,按钮框架取决于标题的长度。 那么至少你应该在添加新按钮之前删除旧按钮。【参考方案2】:

我的问题的解决方案是在 willDisplayCell 中添加按钮并在 didEndDisplayingCell 中删除该单元格的所有按钮。基本上问题是,每次显示单元格时,我都会添加按钮,并且每个单元格都会有很多按钮堆叠在一起。

func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 
    let tableCell = cell as! ExploreTableViewCell;
    let subviews = tableCell.hashtagsView.subviews;
    // todo: should replace with a for in
    for (var i = 0; i < subviews.count; i++) 
        if(subviews[i].isKindOfClass(UIButton))
            subviews[i].removeFromSuperview();
        
    

感谢 TheEye 的帮助。

【讨论】:

以上是关于动态生成按钮时应用程序运行缓慢的主要内容,如果未能解决你的问题,请参考以下文章

从 Dash/Flask 应用程序下载动态生成的文件

在运行时动态生成 DLL 程序集

我的应用程序在设备上运行缓慢是因为我使用的图像以及如何删除硬编码的宽度和高度

在 Angular 7 运行时动态生成 CSS 类

AIX 上生产环境中缓慢的动态 GSP 重新加载

运行缓慢的 Postgres 查询