06-联系人管理(xib应用)
ViewController.h文件中:
@interface ViewController : UIViewController - (IBAction)add:(UIBarButtonItem *)sender;
- (IBAction)remove:(UIBarButtonItem *)sender;
- (IBAction)deleteClick:(UIButton *)btn; @property (weak, nonatomic) IBOutlet UIBarButtonItem *removeItem; @end
ViewController.m文件中:
const int K_ROW_WIDTH = ;
const int K_ROW_HEIGHT = ; #import "ViewController.h"
#include "RowView.h" // 类扩展(class extension),又叫匿名分类
@interface ViewController ()
{
NSArray *_allNames;
}
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_allNames = @[@"努力", @"奋斗", @"加油", @"动力", @"向上"];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)add:(UIBarButtonItem *)sender {
// 1.取出最后一个子控件
UIView *last = [self.view.subviews lastObject];
CGFloat rowY = last.frame.origin.y + last.frame.size.height + ; // 2.创建一行view
UIView *row = [self createRowView];
row.frame = CGRectMake(, rowY, K_ROW_WIDTH, K_ROW_HEIGHT); // 3.添加一行到控制器的view中
[self.view addSubview:row]; // 4.修改删除Item的状态
_removeItem.enabled = YES; // 5.添加动画
CGRect tempFrm = row.frame;
tempFrm.origin.x = K_ROW_WIDTH;
row.frame = tempFrm;
row.alpha = ; [UIView animateWithDuration:0.6 animations:^{
CGRect tempFrm = row.frame;
tempFrm.origin.x = ;
row.frame = tempFrm;
row.alpha = ;
} completion:^(BOOL finished) {
//
}];
} - (UIView *)createRowView
{
//通过加载lib进行新建
NSString *iconName = [NSString stringWithFormat:@"01%d.png", arc4random_uniform()];
NSString *name = _allNames[arc4random_uniform(_allNames.count)];
UIView *row = [RowView rowViewWithIcon:iconName name:name]; return row; } #pragma mark 点击联系人所在行中的“删除”按钮
- (IBAction)deleteClick:(UIButton *)btn
{ [UIView animateWithDuration:0.6 animations:^{
CGRect tempFrm = btn.superview.frame;
tempFrm.origin.x = K_ROW_WIDTH;
btn.superview.frame = tempFrm; btn.superview.alpha = ;
} completion:^(BOOL finished) {
// 获取即将删除的这行在数组中的位置索引
int startIndex = [self.view.subviews indexOfObject:btn.superview]; [UIView animateWithDuration:0.2 animations:^{
for (int i = startIndex; i < self.view.subviews.count; ++i) {
UIView *child = self.view.subviews[i];
CGRect tempFrm = child.frame;
tempFrm.origin.y -= K_ROW_HEIGHT + ;
child.frame = tempFrm;
}
}]; [btn.superview removeFromSuperview];
_removeItem.enabled = self.view.subviews.count > ;
}]; } - (IBAction)remove:(UIBarButtonItem *)sender {
// 1.取出最后一个子控件
UIView *last = [self.view.subviews lastObject]; // // 判断最后一个子控件是否为toolbar控件
// if ([last isKindOfClass:[UIToolbar class]]) {
// return;
// } // 添加动画
[UIView animateWithDuration:0.6 animations:^{
CGRect tempFrm = last.frame;
tempFrm.origin.x = K_ROW_WIDTH;
last.frame = tempFrm;
last.alpha = ;
} completion:^(BOOL finished) {
// 2.删除
[last removeFromSuperview]; // 3.修改删除Item的状态
_removeItem.enabled = self.view.subviews.count > ;
}]; } @end
RowView.xib RowView.h文件中:
@interface RowView : UIView + (id)rowViewWithIcon:(NSString *)icon name:(NSString *)name;
@property (weak, nonatomic) IBOutlet UIButton *iconBtn;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel; @end
RowView.xib RowView.m文件中:
@implementation RowView +(id)rowViewWithIcon:(NSString *)icon name:(NSString *)name
{
RowView *row = [[NSBundle mainBundle] loadNibNamed:@"RowView" owner:nil options:nil][];
[row.iconBtn setImage:[UIImage imageNamed:icon] forState:UIControlStateNormal];
row.nameLabel.text = name; return row;
} @end
界面效果:
一、类扩展(class extension,匿名分类)
1、格式:
@interface ViewController ()
{
// 成员变量
}
// 方法声明
@end
2、作用
1>写在.m文件中
2>一般用来扩充私有成员变量、@property属性、方法等
二、随机数的生产
1、arc4random() 会生成任意正整数和0
2、arc4random_uniform(100) 会生成0~99的整数(包括0和99)
三、UIView常用方法
1、addSubview:(UIView *)child
添加子控件(最新添加的子控件,
2、NSArray *subviews
通过addSubview:方法添加的子控件都会存在于这个数组中
3、removeFromSuperview
将控件本身从父控件中移除(控件本身也会从父控件的subviews数组中移除)
4、(UIView *)viewWithTag:(int)myTag
* 返回tag值等于mytag的子控件
* 如果有多个子控件的tag一样,只会返回第一个匹配的子控件(在搜索tag匹配的控件时,也包括控件本身)
5、UIView *superview
返回父控件
四、xib的基本使用
1.xib和nib是同义词
2.加载xib文件
[[NSBundle mainBundle] loadNibNamed:@"RowView" owner:nil options:nil]
//返回xib文件中,objects下面的所有控件,按顺序装在数组中返回
3.storyboard和xib的异同
1>区别
*stroyboard:描述软件界面,大范围,重量级,比较适合描述整个软件的所有界面
*xib:描述软件界面,小范围,轻量级,比较适合描述某个小界面(局部界面)
2>相同点:
本质都是转成代码(都是xml文件格式)
4.File‘s Owner的使用步骤:
1>在xib文件中设置File‘s Owner的calss属性(目的:是在xib中能找到Owner 的方法)
2>建立File‘s Owner 跟 控件之间的联系(连线)
3>利用代码加载xib,传递Owner参数(类型一定要匹配)
06-联系人管理(xib应用)的更多相关文章
- Datalist增删改查——联系人管理
关于Datalist,其实和Repeater差不多,都是存放数据的控件,相比较下,Datalist和Repeater虽然都是用的模板,但是Datalist比之多了Edit模板,也就是编辑栏的模板,事件 ...
- ASP.NET MVC+Vue.js实现联系人管理
接触了一天vue.js,简单浏览了一本关于vue的电子书,就开始动手使用ASP.NET MVC和Vue.js开发一个联系人管理的小程序. 先看一下这个联系人管理的小程序的界面,也就是我们大概要实现什么 ...
- PHP——内测:联系人管理
要求见文件-内测:联系人管理.pdf 数据库为mycontacts 表格为contacts,groups 表格内容为: zhuye.php <!DOCTYPE html PUBLIC " ...
- iOS UI基础-4.2应用程序管理 Xib文件使用
Xib调整使用 1.新建xib文件 New File-->User Interface-->Empty 2.打开新建的xib文件,出现可视化窗口 (1)拖入一个UIView (不是UIVi ...
- K8S(06)web管理方式-dashboard
K8S的web管理方式-dashboard 目录 K8S的web管理方式-dashboard 1 部署dashboard 1.1 获取dashboard镜像 1.1.1 获取1.8.3版本的dsash ...
- Linux 06 用户组管理
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 每个用户都 ...
- HeadFirst Jsp 06 (会话管理)
现在我们希望能够跨多个请求保留客户特定的状态. 现在, 模型中的业务只是检查请求中的参数, 并返回一个响应(建议), 应用中没有谁记得在当前请求之前与这个客户之间发生过什么. 与一个客户的整个会话期间 ...
- TCP系列06—连接管理—5、TCP fastopen(TFO)
一.TFO背景 当前web和web-like应用中一般都是在三次握手后开始数据传输,相比于UDP,多了一个RTT的时延,即使当前很多应用使用长连接来处理这种情况,但是仍然由一定比例的短连接,这额外多出 ...
- android管理联系人操作
ContentProvider扩展之管理系统联系人 我们都知道ContentProvider是用来共享数据的,然而android本身就提供了大量的ContentProvider,例如联系人信息,系统的 ...
- 用Backbone.js创建一个联系人管理系统(五)
原文: Build a Contacts Manager Using Backbone.js: Part 5 这是这系列教程最后一部分了. 之前所有的增删改都在前端完成. 这部分我们要把Contact ...
随机推荐
- [forward] cmake, CMakeLists.txt梳理
cmake intro 原文请见 cmake使用总结(转)-工程主目录CMakeList文件编写 在 Linux 下进行开发很多人选择编写 makefile 文件进行项目环境搭建,而makefile ...
- SOUI界面库 添加 windows系统文件图标皮肤
最近在学习soui界面库.其中有用到SListCtrl这个控件来现在文件信息.控件用法基本上和mfc 的CListCtrl差不多.也支持图标显示.但是图标是要自己加入图标图片的.这个就有点不好弄.于是 ...
- Linux之强大的selinux
简单点说,SELinux就是用来加强系统安全性的.它给一些特定程序(这些程序也在不断增加)做了一个沙箱,它将文件打上了一个安全标签,这些标签属于不同的类,也只能执行特定的操作,也就是规定了某个应用程序 ...
- 我理解的数据结构(二)—— 栈(Stack)
我理解的数据结构(二)-- 栈(Stack) 一.栈基础 栈是一种线性结构 相比较数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶 栈是一种后进先出的数据结构 ...
- PHP开发错误锦集(持续更新)
1.trait 命名问题. 问题:trait 里定义的方法找不到 <?php namespace app\controllers; trait Example { public function ...
- python 函数编写指南
#函数编写指南:1.给函数指定描述性名称,且只在其中是用小写字母和下划线 2.每个函数都应包含简要的阐述其功能的注释,该注释应紧跟在函数定义后面,且采用文档字符串格式 3.给形参指定默认值时,等号两边 ...
- 洛谷 P1308 统计单词数【字符串处理】
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- javascript 闭包笔记
先来解释一下闭包: 1.闭包就是函数嵌套函数 2.内部函数可以引用外部函数的参数和变量 3.参数和变量不会被垃圾回收机制所收回( 垃圾回收机制就是用完变量之后就在内存中释放 ) 使用闭包的好处: ...
- selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码
目录: 1. 常用操作 2. 查找元素 3. 操作Cookie 4. 获取截图 5. 获取窗口信息 6. 切换 7. 执行JS代码 简介 selenium.webdriver.remote.webdr ...
- 【codeforces 761E】Dasha and Puzzle
[题目链接]:http://codeforces.com/contest/761/problem/E [题意] 给你一棵树,让你在平面上选定n个坐标; 使得这棵树的连接关系以二维坐标的形式展现出来; ...