iOS小技能(开发规范): app的开发步骤

262 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

前言

app的开发步骤:

  1. 搭建界面(应用程序的样本)

  2. 连线(界面按钮和操作功能进行绑定)

1)IBAction:本质上是void,只不过允许连线而已;使用IBAction增加代码的可读性,明显的确定出方法和事件的连接关系

验证 IBAction 本质上是void的方法:使用void替换IBAction 的即可。

例子:计算按钮的点击事件与代码的计算方法的连线

2)IBOutlet:属性与界面的控件对象的连线(获取和修改控件对象的属性)

  1. 编写程序实现功能

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. 搭建界面(应用程序的样本)
  2. 连线:(视图控制器中)--监听按钮事件

1)IBAction:代码方法(操作)于界面的事件连线-》计算按钮的点击事件与代码的计算方法的连线-- IBAction 本质上是void,只不过允许连线而已;使用IBAction增加代码的可读性,明显的确定出方法和事件的连接关系 验证 IBAction 本质上是void的方法:使用void替换IBAction 的即可

2)IBOutlet:属性与界面的控件对象的连线-》获取和修改控件对象的属性

  1. 编写程序实现功能--修改图像按钮的属性,来调整它的位置和大小

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),提高程序的可读性,达到程序的优雅易读

  1. 使用enum 解决模仿数字: 使用枚举值解决模仿数字问题

//button 的tag枚举值定义,解决模仿数字
 
// 枚举类型本质上是整数,定义的时候,如果指定了第一个元素的值,后续的元素值会依次递增
 
typedef enum{
 
    kMoveingDirTop =1,
 
    kMoveingDirBotton,
 
    kMoveingDirLeft,
 
    kMoveingDirRight,
 
} kMoveingDir;
  1. 使用macro 手段避免魔法数字

#define kMovinDalta  20.0f;

see also

iOS解决压缩之后图片模糊的问题

blog.csdn.net/z929118967/…

🍅 联系作者: iOS逆向(公号:iosrev)


🍅 作者简介:CSDN 博客专家认证🏆丨全站 Top 50、华为云云享专家认证🏆、iOS逆向公号号主


🍅 简历模板、技术互助。关注我,都给你。