解决tableView中cell动态加载控件的重用问题

tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问题,即使你能做到该cell只根据数值加载了一回控件,你也没法保证不出现重用问题:)

效果(请注意查看,移动下面的格子时,上面出现了重用的问题)

源码:

YXCell.h

//
//  YXCell.h
//  YXTableView
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface YXCell : UITableViewCell

@property (nonatomic, strong) NSString *count; // 控件个数
@property (nonatomic, assign) BOOL      flag;  // 控制标签

@end

YXCell.m

//
//  YXCell.m
//  YXTableView
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "YXCell.h"

@implementation YXCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self)
    {

    }
    return self;
}

@synthesize count = _count;
- (void)setCount:(NSString *)count
{
    if ([count intValue] > 0 && _flag == NO)
    {
        _flag = YES;

        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
        scrollView.contentSize = CGSizeMake([count intValue]*100, 100);

        for (int i = 0; i < [count intValue]; i++)
        {
            UILabel *tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(i*100, 0, 100, 100)];
            tmpLabel.text     = [NSString stringWithFormat:@"%d", i];
            tmpLabel.textAlignment = NSTextAlignmentCenter;
            tmpLabel.font     = [UIFont fontWithName:@"HelveticaNeue-UltraLight"
                                                size:40.f];
            [scrollView addSubview:tmpLabel];
        }

        [self addSubview:scrollView];
    }

    _count = count;
}

@end

RootViewController.m

//
//  RootViewController.m
//  YXTableView
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "YXCell.h"

#define REUESED_SIZE  100
static NSString *reUsedStr[REUESED_SIZE] = {nil}; // 重用标示
#define REUESED_FLAG  reUsedStr[0]

@interface RootViewController ()<UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, strong) UITableView  *mainTableView;
@property (nonatomic, strong) NSArray      *dataArray;

@end

@implementation RootViewController

+ (void)initialize
{
    if (self == [RootViewController class])
    {
        for (int i = 0; i < REUESED_SIZE; i++)
        {
            reUsedStr[i] = [NSString stringWithFormat:@"YouXianMing_%d", i];
        }
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 数据源
    _dataArray = @[[NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5],
                   [NSString stringWithFormat:@"%d", arc4random()%20 + 5]];

    // UITableView
    _mainTableView = [[UITableView alloc] initWithFrame:self.view.bounds
                                                  style:UITableViewStylePlain];
    _mainTableView.delegate   = self;
    _mainTableView.dataSource = self;
    [self.view addSubview:_mainTableView];
}

#pragma mark - UITableView delegate dataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_dataArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    YXCell *cell = [tableView dequeueReusableCellWithIdentifier:REUESED_FLAG];
    if (cell == nil)
    {
        cell = [[YXCell alloc] initWithStyle:UITableViewCellStyleDefault
                             reuseIdentifier:REUESED_FLAG];
    }

    cell.count = _dataArray[indexPath.row];

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 100;
}

@end

几个比较关键的地方:

本例中出现的重用问题由下面部分引发:

如果要解决这个重用问题,我们只能够让这个cell不重用,那就得定义足够多的重用标示才行,改成如下即可:

效果:

总结:

为何要处心积虑弄这种不重用的cell呢?当然,这是为了满足特定的需求而出现的适合于少量的cell的情形,对于这种动态加载的cell,你亲自动手试一下或许就能明白作者本人为何如此设计的用心良苦:)

解决tableView中cell动态加载控件的重用问题

时间: 2024-10-02 19:27:29

解决tableView中cell动态加载控件的重用问题的相关文章

IOS开发中如何解决TableView中图片延时加载

经常我们会用tableView显示很多条目, 有时候需要显示图片, 但是一次从服务器上取来所有图片对用户来浪费流量, 对服务器也是负担.最好是按需加载,即当该用户要浏览该条目时再去加载它的图片. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = [self g

[转]如何动态加载控件以及插件编程思想(C#) Zd0

Yann LeCun其人,Facebook AI研究院(FAIR)负责人,深度学习三架马车之一,卷积神经网络(CNN)之父,享受得了万人敬仰,也在无人问津的寒冬挣扎过. 他于1960年出生在巴黎,1987-1989年博士后期间拜在大神Geoffrey Hinton门下,1988年被Larry Jackel招入贝尔实验室,1989年提出在计算机视觉中使用卷积神经网络,其后此项技术被用于在自动取款机上读取支票,影响至今.1998年又提出基于梯度的学习. 或许是天性,又或许是经历过神经网络和深度学习备

js动态加载控件jsp页面

例子1:(具体参照drp中的flow_card_add.jsp)<script>    var rowIndex = 0;     function addOneLineOnClick() {        var row=tblFlowCardDetail.insertRow(tblFlowCardDetail.rows.length);        var col = row.insertCell(0);        col.innerHTML = "<input ty

Silverlight日记:动态生成DataGrid、行列装换、动态加载控件

本文主要针对使用DataGrid动态绑定数据对象,并实现行列转换效果. 一,前台绑定 <sdk:DataGrid x:Name="dataGrid2" Style="{StaticResource ResourceKey=safeDataGrid2}" /> using System; using System.Collections; using System.Collections.Generic; using System.Collections.

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题 iOS开发 · 2015-01-22 11:31 MWPhotoBrowser是一个非常不错的照片浏览器,在github的star接近3000个,地址:https://github.com/mwaterfall/MWPhotoBrowser.git MWPhotoBrowser来加载小图1M以下的都应该不会有内存警告的问题.如果遇到大图,3M.4M.5M的大图,很有可能导致内存警告.最近我就遇到这个问题,很是头疼

解决hibernate中的懒加载(延迟加载)问题

解决hibernate中的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载问题,在实体映射时,多对一和多对多中,多的一样的属性默认是lazy="true"(即,默认是延迟加载), 如:<many-to-one name="parent" class="Department" column="parentId" lazy="true"/> 延迟加载表现在:比如:我们要查询id为2的部门数

解决Android中,禁止ScrollView内的控件改变之后自动滚动

问题: 最近在写一个程序界面,有一个scrollVIew,其中有一段内容是需要在线加载的. 当内容加载完成后,ScrollView中内容的长度会发生改变,这时ScrollView会自动下滚,如下图所示: 滚动的那一下体验特别不好,所以要防止这种情况.即不论Scrollview中内容如何,都要保持在最上. 解决办法: 先简单写一下我的xml文件的结构: [html] view plaincopy <ScrollView android:id="@+id/scrollView1" a

自个儿写Android的下拉刷新/上拉加载控件 (续)

本文算是对之前的一篇博文<自个儿写Android的下拉刷新/上拉加载控件>的续章,如果有兴趣了解更多的朋友可以先看一看之前的这篇博客. 事实上之所以会有之前的那篇博文的出现,是起因于前段时间自己在写一个练手的App时很快就遇到这种需求.其实我们可以发现类似这样下拉刷新.上拉加载的功能正在变得越来越普遍,可以说如今基本上绝大多数的应用里面都会使用到.当然,随着Android的发展,已经有不少现成的可以实现这种需求的"轮子"供我们使用了. 但转过头想一下想,既然本来就是自己练手

下拉刷新上拉加载控件+Material Design使用

下拉刷新上拉加载控件+Material Design使用 人所缺乏的不是才干而是志向,不是成功的能力而是勤劳的意志. -- 部尔卫 Material Design控件使用 前几天分享了两篇Material Design控件使用的文章,这里就不多做叙述,下面是传送门,想要学习的小伙伴可以去看下: https://juejin.im/entry/58d8d4d344d90400687c134d/detail#comment https://juejin.im/entry/58d9cdf044d904