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

解决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,你亲自动手试一下或许就能明白作者本人为何如此设计的用心良苦:)

时间: 2024-08-03 11:15:28

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

发现一个.Net中动态加载控件时关于焦点方面的Bug

动态|加载|控件 今天写一个系统框架的时候用到了动态加载,调试的时候发现程序经常会出现死锁的情况,而且死锁的时候还会打开一个"WindowsFormsParkingWindow"后台进程,跑到网上查了半天关于WindowsFormsParkingWindow的资料,结果中文的一篇没找到,蝇文的倒有几篇,对着金山词霸费了九牛二虎之力还没看出个道道来.后来干脆新建了一个项目,只写了几行代码,结果运行的时候发现还是会有死缩的情况: 1.新建一个windows应用程序 2.添加一个UserCo

ASP.net中动态加载控件时一些问题的总结

asp.net|动态|加载|控件|问题 经常见到有人说在ASP.net中不要使用动态控件,我想主要的原因在于使用动态控件会带来一些问题,在做项目的过程中,我将由动态加载控件引发的总是作了一个小小的总结.1 .在使用LoadControl加载控件后,用户控件中的某些控件不再响应事件. 这个问题主要是由于将控件加载放在if (!Page.IsPostBack)之内引起的,放在外面即可.在思归的blog上对此问题进行了详细的说明.2.用户控件中某些控件的响应出现问题,如某个按钮第一次选择时不触发CLI

动态加载控件: 常见问题解决之道

动态加载控件貌似给很多程序员都带来了困扰,经常收到这样的邮件,干脆就写下面这个示 例来演示如何解决那些常见的问题吧. 其实常见的问题通常有这样两个: 1. 通常他们都通过一个按钮来添加一个UserControl 并将它们加入PlaceHolder 容器的 Controls 中.然后页面上就会有一个另外一个按钮,这个按钮什么相关的事也没做,就是做了 一次回发.这样的情况动态添加的控件就不翼而飞了. 2. 今天收到了一封邮件说是要追加控件,和上面的情况看上去好像不一样,但实质就是同 一回事. 原因:

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

编程|动态|加载|控件 关键词:动态加载,控件,插件 控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性.可扩充性大大增强.在网络上,也有很多动态加载控件.动态调用类成员等的资料.下面,我就将动态加载控件总结一下,以供大家参考.(不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝贵意见)一.动态加载控件 动态加载,最基本用到的就是反射机

急,急!!!!!请大家帮忙,如何根据TREEVIEW选择项的不同,动态加载控件,谢谢.

问题描述 如题, 解决方案 解决方案二:用框架可以实现解决方案三:根据TREEVIEW选择项的不同,动态加载控件是不是动态加载结点啊解决方案四:TreeViewtreeView1ButtonbtnOktreeView1.SelectObject=btnOK;试试这个将相应的控件实力复制给SelectObject就行了解决方案五:这个上面有

在Asp.Net中动态加载控件

问题: 假设您有一个Aspx页面,其包含一个名为"Add New" 的Button,而您则想让用户每次点击Button,PostBack到Server,然后创建一个用 户控件的实列,并最终想动态的添加到该页面的ControlCollections中. 之所以我说用用户控件,是因为我们很容易把许多的控件组织到一个单独的控件 中,添加的时候,我们只需把该用户控件添加到页面上就可以了. 设计 解决方法: 我所想到的解决该问题的方法是在Aspx页面上放一个 PlaceHolder容器控件,该控

C# winform程序动态加载控件,总是窗体先出现,窗体上的控件出现屏幕背景,闪一下 才出现控件,出现的时间也不同步

问题描述 初始化显示控件,或者是alt+tab切换页面,的时候都是整个页面先出来,就是有个别的控件出来的很慢,而且带有屏幕的背景色一闪而过,才完全加载出来 解决方案 解决方案二:Up,求解答啊,界面现在初始化的时候,有点闪,接受不了,解决方案三:vs自动生成的Form1.Designer.cs中,控件都是用下面代码包裹起来的.你就没想过是为什么吗?this.SuspendLayout();......this.ResumeLayout(false);this.PerformLayout();解决

简单的ASP.NET 动态加载控件实现代码

下面示范一个最简单的 范例,就是大家最常见的 Hello World 来示范    代码如下 复制代码 <%@ Page Language="C#" AutoEventWireup="True" %> <script language="C#" runat=server> void SubmitBtn_Click(Object sender, EventArgs e){Label message = new Label()

Android中利用动态加载实现手机淘宝的节日特效_Android

相信去年圣诞节打开过手机淘宝的童鞋都会对当时的特效记忆犹新吧:全屏飘雪,旁边还有个小雪人来控制八音盒背景音乐的播放,让人有种身临其境的感觉,甚至忍不住想狠狠购物了呢(误),大概就是下面这个样子滴: 嗯,确实很炫,那么我们一步步去分析是如何实现的: 一.实现下雪的 View 首先,最上面一层的全屏雪花极有可能是一个顶层的View,而这个View是通过动态加载去控制显示的(不更新淘宝也能看到这个效果).那么我们先得实现雪花效果的 View,人生苦短,拿来就用.打开 gank.io,搜索"雪花&quo