重写UITableViewCell子类中属性的setter方法来实现隐藏或显示该cell中的某些控件

为什么会需要这样子的一种方法来实现隐藏或者显示一个cell中的某些控件呢?

其实,隐藏cell中某些控件可以直接在tableView:cellForRowAtIndexPath:方法中直接实现,我们需要判断外部变量比如bool值来决定是否显示这个控件,但需要额外的代码写在tableView:cellForRowAtIndexPath:方法当中,如果我们把bool值传递给该cell让其自己判断是否显示隐藏这个控件,可读性将会大幅增加:)

效果:

源码:

YXCell.h

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

#import <UIKit/UIKit.h>

@interface YXCell : UITableViewCell

@property (nonatomic, strong) UIImageView   *headView;      // 头像
@property (nonatomic, assign) BOOL           showHeadView;  // 是否显示头像

@property (nonatomic, strong) UILabel       *name;
@property (nonatomic, assign) BOOL           showName;

@end

YXCell.m

//
//  YXCell.m
//  SomeCell
//
//  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)
    {
        // 头像
        _headView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 160, 100)];
        [self addSubview:_headView];

        // 标签
        _name      = [[UILabel alloc] initWithFrame:CGRectMake(180, 10, 200, 30)];
        _name.font = [UIFont fontWithName:@"HelveticaNeue-Thin"
                                     size:20.f];
        _name.textColor = [UIColor orangeColor];
        [self addSubview:_name];
    }
    return self;
}

@synthesize showHeadView = _showHeadView;
- (void)setShowHeadView:(BOOL)showHeadView
{
    _showHeadView = showHeadView;
    if (_showHeadView == YES)
    {
        _headView.alpha = 1;
    }
    else
    {
        _headView.alpha = 0;
    }
}

@synthesize showName = _showName;
- (void)setShowName:(BOOL)showName
{
    _showName = showName;
    if (_showName == YES)
    {
        _name.alpha = 1;
    }
    else
    {
        _name.alpha = 0;
    }
}

@end

RootViewController.m

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

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

@interface RootViewController ()<UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) UITableView   *tableView;
@property (nonatomic, strong) NSArray       *data;

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 初始化数据源
    _data = @[@{@"showHeadView": [NSNumber numberWithBool:YES],
                @"showName"    : [NSNumber numberWithBool:YES],
                @"name"        : @"YouXianMing"},
              @{@"showHeadView": [NSNumber numberWithBool:YES],
                @"showName"    : [NSNumber numberWithBool:NO],
                @"name"        : @"YouTianXing"},
              @{@"showHeadView": [NSNumber numberWithBool:YES],
                @"showName"    : [NSNumber numberWithBool:YES],
                @"name"        : @"YouJin"},
              @{@"showHeadView": [NSNumber numberWithBool:NO],
                @"showName"    : [NSNumber numberWithBool:NO],
                @"name"        : @"YouXia"},
              @{@"showHeadView": [NSNumber numberWithBool:NO],
                @"showName"    : [NSNumber numberWithBool:YES],
                @"name"        : @"YouMeng"},
              @{@"showHeadView": [NSNumber numberWithBool:YES],
                @"showName"    : [NSNumber numberWithBool:YES],
                @"name"        : @"YouZiLing"}];

    // 初始化tableView
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds
                                              style:UITableViewStylePlain];
    _tableView.delegate   = self;
    _tableView.dataSource = self;
    [self.view addSubview:_tableView];
}

#pragma mark - 代理
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_data count];
}

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

    // 设置头像
    cell.headView.image = [UIImage imageNamed:@"back.jpg"];
    cell.showHeadView   = [_data[indexPath.row][@"showHeadView"] boolValue];

    // 设置文本
    cell.name.text = _data[indexPath.row][@"name"];
    cell.showName  = [_data[indexPath.row][@"showName"] boolValue];

    return cell;
}

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

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

@end

重写UITableViewCell子类中属性的setter方法来实现隐藏或显示该cell中的某些控件,布布扣,bubuko.com

时间: 2024-08-24 05:22:28

重写UITableViewCell子类中属性的setter方法来实现隐藏或显示该cell中的某些控件的相关文章

@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。

@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常. java public class Student { private Integer age; private String name; @Required public void setAge(Integer age) { this.age = age; } public

有一个NSStirng类型,retain方式声明的name属性的setter方法内部每一行代码的作用?

- (void)setName:(NSString *)name { 判断原有对象和新对象是否是同一个对象,如果是同一个,就没有必要再重新赋值,否则会先release 再retain,就会变成野指针 if (_name != name) { 释放保有之前对象的所有权 [_name release]; 让实例变量 _name保有新的对象的所有权 _name = [name retain]; } } 有一个NSStirng类型,retain方式声明的name属性的setter方法内部每一行代码的作用

b/s和C/S方法用C#递归方法把数据表加载到treeview控件中

先看一下数据库的结构: 表结构如下所示: Num                   Name                                 fatherNum       BZ 01                      总节点                                      0              ...... 0101                   第一个一级节点                          01      

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

tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问题,即使你能做到该cell只根据数值加载了一回控件,你也没法保证不出现重用问题:) 效果(请注意查看,移动下面的格子时,上面出现了重用的问题) 源码: YXCell.h // // YXCell.h // YXTableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import

在Android中如何获取视频的第一帧图片并显示在一个ImageView中

String path  = Environment.getExternalStorageDirectory().getPath(); MediaMetadataRetriever media = new MediaMetadataRetriever(); media.setDataSource(path+"/123.rmvb"); Bitmap bitmap = media.getFrameAtTime(); image = (ImageView)this.findViewById(

ios-根据单元格里的控件tag值,在方法外获得对应的section与row的值

在cell的代理方法里:cellForRowAtIndexPath btn.tag = indexPath.section *100 + indexPath.row; [cell.exitPersonBtn addTarget:self action:@selector(exitPersonBtnClick:) forControlEvents:UIControlEventTouchUpInside]; btn点击后触发的方法里,通过tag值获得cell里对应的控件 GroupMemberDat

JavaScript中闭包实现的私有属性的getter()和setter()方法

注意: 以下的输出都在浏览器的控制台中 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>闭包</title> </head> <body> <script type="text/javascript"> /** * 利用闭包实现 * 这个函数给对象o增加了属性存储器方法 * 方法名称为ge

理解Struts2的Action中的setter方法是怎么工作的

接触过webwork和Struts2的同行都应该知道, 提交表单的时候,只要Action中的属性有setter 方法,这些表单数据就可以正确赋值到Action中属性里:另外对于Spring配置文件中声明的bean,也可以在Action中声明setter 方法将其注入到Action实例中.那么现在要研究:这些是怎么工作的呢? (1)提交表单时的参数 在struts2-core-2.3.1.2.jar压缩包内的struts-default.xml配置文件中有这个配置:<interceptor nam

QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

QT中获取选中的radioButton的两种方法 QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast<QRadioButton*>(ui->BG->checkedButton()); 2 QString name = pbtn->objectName(); 3 if(!QString::compare(name, "rad