一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
前言
app的开发步骤:
-
搭建界面(应用程序的样本)
-
连线(界面按钮和操作功能进行绑定)
1)IBAction:本质上是void,只不过允许连线而已;使用IBAction增加代码的可读性,明显的确定出方法和事件的连接关系
验证 IBAction 本质上是void的方法:使用void替换IBAction 的即可。
例子:计算按钮的点击事件与代码的计算方法的连线
2)IBOutlet:属性与界面的控件对象的连线(获取和修改控件对象的属性)
- 编写程序实现功能
I 搭建界面
用纯代码开发的过程:blog.csdn.net/z929118967/…
确定界面元素,要有什么内容 用代码搭建界面 编写代码
II 连线的建立:IB 与代码的连接
1.在.m文件中书写方法和属性 2. 添加IBOutlet或者IBAction 3. 进行属性、方法与IB的连接
2.1 IBAction在IB中的源码
connections 的子标签:action、outlet
<connections>
<action selector="compute" destination="BYZ-38-t0r" eventType="touchUpInside" id="nRR-Ts-mdy"/><!-- destination属性值与viewController标签的ID属性值对应,事件类型为touchUpInside-->
</connections>
2.2 IBOutlet的源码
<connections>
<outlet property="numLeft" destination="fAv-gN-3wn" id="afF-lT-F3e"/> <!-- outlet 标签的目标属性destination的值与textField标签的ID属性值对应-->
<outlet property="numRight" destination="ckV-X6-tGL" id="MIb-xK-6hD"/>
<outlet property="resultLabel" destination="zv3-WY-PfL" id="DUL-Fn-rTa"/>
</connections>
2.3 方法和属性声明
/**
用来声明属性和方法以及静态界面与代码的关联
代码与界面上的对象进行通信:即代码如何操作界面上的对象--在iPhone平台上引入了IBAction、IBOutlet
IB :interface builder 界面搭建
IB修饰符: IBAction & IBOutlet、Outlet connection 三种
IBAction:监听方法与点击按钮事件进行连线--使用IBAction修饰方法,表示该方法与UI界面上的某个监听事件对应
IBoutlet:UIViewController 对象的属性与UI的控件对象进行连线,以便对控件的属性进行获取和修改--与IB的连线:在变量之前加上IBOutlet来表示,该变量与界面上的某个UI对象对应
*/
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic,weak) IBOutlet UITextField *numLeft;
@property (nonatomic,weak) IBOutlet UITextField *numRight;
@property (nonatomic,weak) IBOutlet UILabel *resultLabel;
/** 计算方法声明*/
- (void) compute;
@end
III 编写程序实现功能(方法的实现)
在storyBoard 上的控件按住control 进行与.m文件的连接
加法计算的实现
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
/** 视图加载完成会被执行*/
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"==========viewDidLoad");
}
- (IBAction)compute {//与界面计算按钮关联并在监听到用户点击之后,进行数据处理和数据展示
NSLog(@"=====compute");
//1.获取界面的文本框内容
NSString *n1=self.numLeft.text;
NSString *n2=self.numRight.text;
NSLog(@"n1= %@ n2= %@",n1,n2);
//2.内容相加
int result=n1.intValue+n2.intValue;
NSLog(@"result= %d",result);
//3.在右侧标签上显示结果
self.resultLabel.text=[NSString stringWithFormat:@"%d" ,result];
//4.退出键盘
//在所有的面向对象语言中,有一个原则:谁申请,谁释放
//resignFirstResponder : Notifies the receiver that it has been asked to relinquish its status as first responder in its window. 让文本框不再担当第一响应者
//FirstResponder:光标是在的文本框
//resign 辞去
//self.numLeft resignFirstResponder];
// [self.numRight resignFirstResponder];
//Causes the view (or one of its embedded text fields) to resign the first responder status.
[self.view endEditing:YES];//yes 参数避免多线程问题
}
@end
IV app的开发步骤分析
- 搭建界面(应用程序的样本)
- 连线:(视图控制器中)--监听按钮事件
1)IBAction:代码方法(操作)于界面的事件连线-》计算按钮的点击事件与代码的计算方法的连线-- IBAction 本质上是void,只不过允许连线而已;使用IBAction增加代码的可读性,明显的确定出方法和事件的连接关系 验证 IBAction 本质上是void的方法:使用void替换IBAction 的即可
2)IBOutlet:属性与界面的控件对象的连线-》获取和修改控件对象的属性
- 编写程序实现功能--修改图像按钮的属性,来调整它的位置和大小
1)一个UIImage对象代表一张图片,一般通过imageNamed:方法就可以通过文件名加载项目中的图片(PNG格式的图片可以省略扩展名)
UIImage加载图片 :UIImage *image = [UIImage imageNamed:@"btn_01"];
V 开发规范
5.1 修改对象的结构体属性的成员的三个步骤
修改对象的结构体属性的成员步骤
// self.iconButton.frame.origin.y-=10;//OC中,不予许直接修改“对象”(iconButton)的“结构体属性”(frame)的“成员”(origin);但是允许修改结构体属性的成员
//修改对象的结构体属性的成员通常采用以下三个步骤
//1. 从对象取出frame结构体属性
CGRect frame = self.iconButton.frame;
//2.修改结构体属性成员
frame.origin.y-=20;
//3.将对象的结构体属性进行赋值,达到修改的目的
self.iconButton.frame=frame;
5.2 代码优化
优化习惯手段:先重构且测试完成,再删除原来的旧代码
1.代码优化:尽量让类似功能的代码只出现一次
让重复的代码只出现一次--合并相同的代码
button点击事件与上下左右移动控件的方法连线的代码优化示例
/**
1.基本功能实现
2. 代码优化:尽量让类似功能的代码只出现一次
*/
/**让重复的代码只出现一次--合并相同的代码*/
- (IBAction)move:(UIButton *)button {
//1. 取出结构体对象
CGRect frame =self.iconButton.frame;
NSLog(@"get frame & button= %ld",button.tag);
//2. 根据按钮的类型tag进行修改结构体(变化的代码)--利用UIView的属性tag :@property(nonatomic) SInteger tag ; Description An integer that you can use to identify view objects in your application.
// tag=1:top,2:bottom,3:left,4:right--tag 的值属于枚举值,可以去掉default的处理
// 避免魔法数字(magic number)
switch (button.tag) {
case kMoveingDirTop:
frame.origin.y-=10;
NSLog(@"1");
break;
case kMoveingDirBotton:
frame.origin.y+=10;
NSLog(@"2");
break;
case kMoveingDirLeft:
frame.origin.x-=10;
break;
case kMoveingDirRight:
frame.origin.x+=10;
break;
}
//3.将结构体属性设置回对象
self.iconButton.frame= frame;
}
/** 向上移动*/
- (IBAction)top {
//使用frame进行位置的修改
// self.iconButton.frame.origin.y-=10;//OC中,不予许直接修改“对象”(iconButton)的“结构体属性”(frame)的“成员”(origin);但是允许修改结构体属性的成员
//修改对象的结构体属性的成员通常采用以下三个步骤
//1. 从对象取出frame结构体属性
CGRect frame = self.iconButton.frame;
//2.修改结构体属性成员
frame.origin.y-=20;
//将对象的结构体属性进行赋值,达到修改的目的
self.iconButton.frame=frame;
}
- (IBAction)right {
//1. 从对象获取结构体属性
CGRect frame= self.iconButton.frame;
//2. 修改结构体属性成员
frame.origin.x+=20;
//3.修改对象的结构体属性-》间接修改对象的结构体属性的成员
self.iconButton.frame=frame;
}
- (IBAction)left {
//1.从iconButton对象获取frame结构体属性
CGRect frame= self.iconButton.frame ;
//2. 修改结构体属性的成员
frame.origin.x-=20;
//3.将修改之后的结构体对象赋值给iconButton对象的结构体属性frame
self.iconButton.frame= frame;
}
//向下移动
- (IBAction)bottom {
//1. 获取结构体属性
CGRect frame= self.iconButton.frame;
//2. 修改结构体属性
frame.origin.y+=20;
//3. 将结构体属性赋值到iconButton对象
self.iconButton.frame=frame;
}
5.3 避免魔法数字
避免魔法数字(magic number),提高程序的可读性,达到程序的优雅易读
- 使用enum 解决模仿数字: 使用枚举值解决模仿数字问题
//button 的tag枚举值定义,解决模仿数字
// 枚举类型本质上是整数,定义的时候,如果指定了第一个元素的值,后续的元素值会依次递增
typedef enum{
kMoveingDirTop =1,
kMoveingDirBotton,
kMoveingDirLeft,
kMoveingDirRight,
} kMoveingDir;
- 使用macro 手段避免魔法数字
#define kMovinDalta 20.0f;
see also
iOS解决压缩之后图片模糊的问题
🍅 联系作者: iOS逆向(公号:iosrev)
🍅 作者简介:CSDN 博客专家认证🏆丨全站 Top 50、华为云云享专家认证🏆、iOS逆向公号号主
🍅 简历模板、技术互助。关注我,都给你。