iOS开发UI篇-懒加载、重写setter方法赋值
一、懒加载
1.懒加载定义
懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,写的是其get方法.
注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化
2.使用懒加载的好处:
(1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强
(2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合
3.代码示例
#import "ViewController.h" @interface ViewController () @property (nonatomic, strong)UIImageView *imageView;//QQ图片 @property (nonatomic, strong)UILabel *userNameLabel;//用户名 @property (nonatomic, strong)UITextField *userNameTextField;//用户名输入框 @property (nonatomic, strong)UILabel *passwordLabel;//密码 @property (nonatomic, strong)UITextField *passwordTextField;//密码输入框 @end
@implementation ViewController
/** 懒加载
* 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,写的是其get方法;
* 图片控件的延迟加载
*/
- (UIImageView *)imageView {
//判断对象是否已经有了,如果没有,则进行实例化创建对象
if (_imageView == nil) {
self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width - , )];
//添加图片
_imageView.image = [UIImage imageNamed:@"QQ.jpg"];
}
return _imageView;//返回图片控件对象
}
/**
* 懒加载
* 用户名标签控件的延迟加载
*/
- (UILabel *)userNameLabel {
//判断对象是否已经有了,如果没有,则进行实例化创建对象
if (_userNameLabel == nil) {
self.userNameLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];
_userNameLabel.adjustsFontSizeToFitWidth = YES;
_userNameLabel.text = @"用户名";
}
return _userNameLabel;
}
/**
* 懒加载
* 用户名输入框的延迟加载
*/
- (UITextField *)userNameTextField {
//判断对象是否已经存在,如果不存在,则进行实例化创建对象
if (_userNameTextField == nil) {
self.userNameTextField = [[UITextField alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width - , )];
_userNameTextField.placeholder = @"请输入用户名:";
_userNameTextField.borderStyle = UITextBorderStyleRoundedRect;
}
return _userNameTextField;
}
/**
* 懒加载
* 密码标签的懒加载
*/
- (UILabel *)passwordLabel {
//判断对象是否已经存在,如果不存在,则进行实例化创建对象
if (_passwordLabel == nil) {
self.passwordLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];
_passwordLabel.text = @"密码";
_passwordLabel.adjustsFontSizeToFitWidth = YES;
}
return _passwordLabel;
}
/**
* 懒加载
* 密码输入框的懒加载
*/
- (UITextField *)passwordTextField {
//判断对象是否已经存在,如果不存在,则进行实例化创建对象
if (_passwordTextField == nil) {
self.passwordTextField = [[UITextField alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width - , )];
_passwordTextField.borderStyle = UITextBorderStyleRoundedRect;
_passwordTextField.placeholder = @"请输入密码:";
}
return _passwordTextField;
}
- (void)viewDidLoad {
[super viewDidLoad];
//将图片控件添加到视图控制器的根视图view上;
[self.view addSubview:self.imageView];
//将用户名控件添加到视图控制器的根视图view上
[self.view addSubview:self.userNameLabel];
//将用户名输入框控件添加到视图控制器的根视图view上
[self.view addSubview:self.userNameTextField];
//将密码控件添加到视图控制器的根视图view上
[self.view addSubview:self.passwordLabel];
//将密码输入框对象添加到视图控制器的根视图view上
[self.view addSubview:self.passwordTextField];
// Do any additional setup after loading the view, typically from a nib.
}
二、重写setter方法赋值
在UITableView中为cell上的控件赋值,可以在自定义的cell接口部分声明一个方法,然后在实现部分为cell上的控件赋值即可,不过,如果在接口部分写一个属性,然后,在对应的实现部分重写setter方法为cell上的控件赋值,这样在外界访问时就更加方便了;
代码实例如下:
@interface Person : NSObject
@property (nonatomic, strong)NSString *name;//姓名
@property (nonatomic, strong)NSString *phoneNumber;//电话号码
//自定义初始化方法
- (id)initWithName:(NSString *)name
phoneNumber:(NSString *)phoneNumber;
@end
#import "Person.h"
@implementation Person
- (id)initWithName:(NSString *)name phoneNumber:(NSString *)phoneNumber {
self = [super init];
if (self) {
self.name = name;
self.phoneNumber = phoneNumber;
}
return self;
}
#import#import "Person.h"
/*
定制cell
*/
@interface CustomCell : UITableViewCell
@property (nonatomic, strong)UILabel *nameLabel;//姓名
@property (nonatomic, strong)UILabel *phoneNumberLabel;//电话
@property (nonatomic, strong)Person *model;//属性,为cell上的控件赋值
@end
#import "CustomCell.h"
@implementation CustomCell
//重写初始化方法
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithStyle:style reuseIdentifier:
reuseIdentifier];
if (self) {
//1.添加联系人姓名
self.nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];
self.nameLabel.textAlignment = NSTextAlignmentLeft;
self.nameLabel.adjustsFontSizeToFitWidth = YES;
self.nameLabel.textColor = [UIColor blackColor];
[self.contentView addSubview:self.nameLabel];
//2.添加电话号码
self.phoneNumberLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];
self.phoneNumberLabel.textAlignment = NSTextAlignmentLeft;
self.phoneNumberLabel.adjustsFontSizeToFitWidth = YES;
[self.contentView addSubview:self.phoneNumberLabel];
}
return self;
}
//重新setter方法,为cell上的控件赋值
- (void)setModel:(Person *)model {
if (_model != model) {
_model = model;
}
//为nameLabel赋值
self.nameLabel.text = model.name;
//为phoneNumberLabel赋值
self.phoneNumberLabel.text = model.phoneNumber;
}
@end
//在配置cell的方法里,调用setter方法,为cell的控件赋值;
//配置cell 设置cell上显示的内容,同时返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//使用自定义cell
//1.创建静态标示符字符串
static NSString *cellIdentifier = @"CELL";
//2.根据重用标示符去重用队列里找对应类型的cell使用,(获取可重用的cell)
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
//3.判断是否从重用队列中获取到可重用的cell,如果没有获取到,则需要重新创建相对应类型的cell对象
if (cell == nil) {
cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
//让cell上的控件显示数据,为cell赋值
cell.model = [self.personArray objectAtIndex:indexPath.row];
return cell;
}
两种懒加载方法区别:第一种点语法,会死循环. 懒加载要用第二种方法. 点语法就是调用set和get方法, 还没初始化实例,又在get里面调用setget,是不行地!
self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(130, 80, self.view.frame.size.width - 260, 155)];(不会递归)
_imageView = [[UIImageView alloc]initWithFrame:CGRectMake(130, 80, self.view.frame.size.width - 260, 155)];
一个声明好的属性可以同时实现set和get方法吗?我试了,两个同时实现会报错!注释掉其中一个就不报错了!这是为什么?
同时重写需要自己声明@synthesize <#property#>,不然系统不会再自动关联<#property#>和 _<#property#>.
iOS开发UI篇-懒加载、重写setter方法赋值的更多相关文章
- iOS开发UI篇—懒加载
iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- iOS开发UI中懒加载的使用方法
1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...
- iOS开发——UI基础-懒加载,plist文件,字典转模型,自定义view
一.懒加载 只有使用到了商品数组才会创建数组 保证数组只会被创建一次 只要能够保证数组在使用时才创建, 并且只会创建一次, 那么我们就称之为懒加载 lazy - (void)viewDidLoad 控 ...
- iOS开发UI篇—懒载入
iOS开发UI篇-懒载入 1.懒载入基本 懒载入--也称为延迟载入,即在须要的时候才载入(效率低,占用内存小).所谓懒载入,写的是其get方法. 注意:假设是懒载入的话则一定要注意先推断是否已经有了. ...
- UI篇—懒加载
1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...
- iOS开发UI篇—UITableview控件使用小结
iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...
- iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...
- iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...
随机推荐
- PHP面向对象(OOP):抽象方法和抽象类(abstract)
在OOP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口.而抽象方法就是为了方便继承而引入的,我们先来看一下抽象类和抽象方法的定义再说明它的用途. 什么是抽象方 ...
- List<String^>^ 引用空间
莫名其妙报错 需要在.h和.cpp文件中都引用: using namespace System::Collections;using namespace System::Collections::Ge ...
- 学会爱上iOS自动布局(Auto Layout) - 剑尖
本文翻译自Yari Dareglia的LEARN TO LOVE AUTO LAYOUT文章先生们,女士们,让我们以正确的心态开始本教程吧:自动布局就是简单!我花了一段时间来掌握自动布局是如何工作的, ...
- 离散傅里叶变换(DFT)
目录 一.研究的意义 二.DFT的定义 三.DFT与傅里叶变换和Z变换的关系 四.DFT的周期性 五.matlab实验 五.1 程序 ...
- 如何将BarTender内容锁定不让改动
条码标签代表的是产品的特性等,具有相当的精确性,所以需要保证它的正确性.而使用BarTender软件,可以帮助小伙伴将设计的条码标签内容锁定,保护它而不被人改动.下面,小编就教教大家如何实现BarTe ...
- PHPStorm自动提示方法
第一种: /** * 一定要写@return static * @return static */ public static function getInstance() { $className ...
- [BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】
题目链接:BZOJ - 1874 题目分析 这个是一种组合游戏,是许多单个SG游戏的和. 就是指,总的游戏由许多单个SG游戏组合而成,每个SG游戏(也就是每一堆石子)之间互不干扰,每次从所有的单个游戏 ...
- java Active Object模式(上)
Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...
- c# 基础连接已经关闭: 连接被意外关闭,错误的解决
原文:c# 基础连接已经关闭: 连接被意外关闭,错误的解决 调试一个使用HttpWebRequest模拟提交表单的程序的时候频繁出现上述错误提示,google了一下发现了几个解决方案.1.在appli ...
- -_-#【jQuery插件】textSlider 文本滚动
jQuery.textSlider.js ;(function($) { $.fn.textSlider = function(settings) { settings = jQuery.extend ...