宏定义统一以大写K开头。(为了方便书写可以约定小写k开头);变量,如api等最好使用extern替换,宏只定义方法等不需要改变的代码,为了加快编译速度。部分优化手段只适用宏不改变的情况优化,宏修改重新编译。 https://www.jianshu.com/p/ba5b2f1ab9f8
私有变量推荐以_开头
图片资源针对每个模块创建一个xcassets文件, 图片命名 1.命名规范:不能有中文、大写、特殊符号、空白 2.命名格式(推荐): fileType[function]project[pageName]imageName[status]{.png,@2x.png,@3x.png} 万能公式:类别_功能_模块_页面_名称_状态.png
建议在定义NSArray和NSDictionary时使用泛型,可以保证程序的安全性:
以HJ开头
Xcode 代码块的存放地址:~/Library/Developer/Xcode/UserData/CodeSnippets Xcode 文件模版的存放地址:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/
static
修饰,但这样你如果换了个控制器还得再写一遍很僵硬,不是很推荐.static NSString *baseInfomationSubCellID = @"CBaseInfoSubCell";
extern
来修饰,这有个优点,就是当你的cell需要在多个控制器上使用时,会很方便.//头文件,你要是使用苹果的extern当然也可以
extern NSString *const CBASE_INFOMATION_CELLID;
//实现文件
NSString *const CBASE_INFOMATION_CELLID = @"CBaseInfomationCell";
UITableViewCell
的基类或者分类中写一个类方法,能够获取cell
的类名
+ (NSString *)getCellIDStr
{
return NSStringFromClass([self class]);
}比如说一个姓名label
是写成nameLabel
或nameLab
.
[[KLPrestoClient prestoClient] postBaseInfoMationWithEducation:_postParaFlags.education
monthlyIncome:_postParaFlags.monthlyIncome
professionType:_postParaFlags.jobInfo
marriage:_postParaFlags.marriage
cityName:_cityNameStr
cityAddress:_addressStr
latitude:_latitudeStr
longitude:_longitudeStr
isProvidentFund:providentFundModel.selectedIndex
eMailAddress:_EMailAddrStr
censusIsLiveCity:censusModel.selectedIndex
isHud:YES
success:^(BaseModel *model) {
if ([model.status isEqualToString:@"000"]) {
//上传数据成功
[self.navigationController popViewControllerAnimated:YES];
} else {
}
} failture:^(id error) {
}];
/**
对城市按照首字母分组
*/
- (NSArray *)p_makeCityGroup:(NSArray *)cityArray{
NSMutableArray *letterDictArray = [NSMutableArray array];
//创建26个数组用来存储
for (int i = 0; i < 26; i ++) {
NSMutableArray *letterCityArray = [NSMutableArray array];
[letterDictArray addObject:letterCityArray];
}
for (CCityModel *model in cityArray) {
//将城市首字母转化为asic码
int asciiCode = [model.cityCode characterAtIndex:3];
int index = asciiCode - 97;
[letterDictArray[index] addObject:model];
}
return [letterDictArray copy];
}
readwrite
/**
普通model
*/
- (instancetype)initNormalModelWithTitle:(NSString *)title answer:(NSString *)answer answerArray:(NSArray *)answerArray {
return [self initBaseInfomationWithTitle:title
answer:answer
selectedIndex:NO_CHOOSE_ANSWER_INDEX
isMap:NO
answerArray:answerArray
isTwoChooseBtnCell:NO
isEMailAddressCell:NO];
}
/**
带地图的model
*/
- (instancetype)initMapModelWithTitle:(NSString *)title answer:(NSString *)answer {
return [self initBaseInfomationWithTitle:title
answer:answer
selectedIndex:NO_CHOOSE_ANSWER_INDEX
isMap:YES
answerArray:nil
isTwoChooseBtnCell:NO
isEMailAddressCell:NO];
}
/**
二选一model
*/
- (instancetype)initTwoChooseOneModelWithTitle:(NSString *)title answerArray:(NSArray *)answerArray {
//index传-1表示二选一未选择
return [self initBaseInfomationWithTitle:title
answer:@""
selectedIndex:NO_CHOOSE_ANSWER_INDEX
isMap:NO
answerArray:answerArray
isTwoChooseBtnCell:YES
isEMailAddressCell:NO];
}
/**
带邮箱的model
*/
- (instancetype)initEMailModelWithTitle:(NSString *)title defaultAnswer:(NSString *)defaultAnswer{
//index传-1表示未输入
return [self initBaseInfomationWithTitle:title
answer:defaultAnswer
selectedIndex:NO_CHOOSE_ANSWER_INDEX
isMap:NO
answerArray:nil
isTwoChooseBtnCell:NO
isEMailAddressCell:YES];
}
/**
完全初始化
*/
- (instancetype)initBaseInfomationWithTitle:(NSString *)title answer:(NSString *)answer selectedIndex:(NSInteger)selectedIndex isMap:(BOOL)isMap answerArray:(NSArray *)answerArray isTwoChooseBtnCell:(BOOL)isTwoChooseBtnCell isEMailAddressCell:(BOOL)isEMailAddressCell{
if (self = [super init]) {
_title = title;
_answer = answer;
_selectedIndex = selectedIndex;
_isMap = isMap;
_answerArray = answerArray;
_isTwoChooseBtnCell = isTwoChooseBtnCell;
_isEMailAddressCell = isEMailAddressCell;
}
return self;
}
@end
//
// JLaunchViewController.m
// J1000
//
// Created by 作者姓名 on 17/2/8.
// Copyright © 2017年 user. All rights reserved.
//
#import "JLaunchViewController.h"
@interface JLaunchViewController ()<UIScrollViewDelegate>
/*
* 引导页位置指示器
*/
@property (weak, nonatomic) IBOutlet UIPageControl *dotPageControl;
/*
* 引导图容器
*/
@property (weak, nonatomic) IBOutlet UIScrollView *intrScrollView;
/*
* 进入按钮
*/
@property (weak, nonatomic) IBOutlet UIButton *nextButton;
@end
@implementation JLaunchViewController{
/*
* 引导图数组
*/
NSMutableArray * _imageArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化界面
[self initView];
// 数据绑定()
[self dataBind];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - UI
/*
* 初始化界面
*/
- (void)initView{
// 设置scrollView属性(隐藏水平滚动条,边框不反弹、整页翻动、关联代理类)
self.intrScrollView.showsHorizontalScrollIndicator = NO;
self.intrScrollView.bounces = NO;
self.intrScrollView.pagingEnabled = YES;
self.intrScrollView.delegate = self;
// 设置pageControl属性(设置指示圆点默认色值与选中色值、背景颜色、整页翻动后再切换当前位置)
self.dotPageControl.currentPageIndicatorTintColor = [UIColor blackColor];
self.dotPageControl.pageIndicatorTintColor = [UIColor whiteColor];
self.dotPageControl.backgroundColor = [UIColor clearColor];
self.dotPageControl.defersCurrentPageDisplay = YES;
// 默认隐藏底部按钮
self.nextButton.hidden = YES;
}
/*
* 数据绑定
*/
- (void)dataBind{
// 测试
_imageArray = [[NSMutableArray alloc]initWithObjects:@1, @2, @2, @2, @2, nil];
// 设置ScrollView内容的宽度与高度
self.intrScrollView.contentSize = CGSizeMake(ScreenWidth * _imageArray.count, ScreenHeight);
// 循环添加图片
for (int i = 0; i< _imageArray.count ; i++) {
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(ScreenWidth * i, 0, ScreenWidth, ScreenHeight)];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.backgroundColor = i == 0 ? [UIColor greenColor] : [UIColor orangeColor];
[self.intrScrollView addSubview:imageView];
}
// 设置pageControl圆点总数与当前位置
self.dotPageControl.numberOfPages = _imageArray.count;
self.dotPageControl.currentPage = 0;
}
#pragma mark - target
/*
* 进入按钮单击事件处理函数
*/
- (IBAction)didClickNextBtn:(id)sender {
if (self.loginSwitchVCBlock) {
self.loginSwitchVCBlock();
}
}
#pragma mark - delegate
/*
* 滚动视图滚动事件处理函数
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
// 当拖动偏移量超过半屏时切换圆点位置
self.dotPageControl.currentPage = (int) (scrollView.contentOffset.x + ScreenWidth/2) /ScreenWidth;
// 判断是否隐藏进入按钮
self.nextButton.hidden = !(self.dotPageControl.currentPage == _imageArray.count - 1);
}
@end
名称 | 缩写 |
---|---|
infomation | info |
message | msg |
descriptation | desc |
类 | 要求 | 例如 |
---|---|---|
ViewController | 使用Controller做后缀 | 例子: DDFHomeController |
View | 使用View做后缀 | 例子: DDFAlertView |
UITableCell | 使用Cell做后缀 | 例子: DDFNewsCell |
Protocol | 使用Delegate或者DataSource作为后缀 | 例子: UITableViewDelegate |
Model | 使用model作为后缀 | 例子: DDFDataModel |
单例 | manager | 例子: DDFUserInfoManager |
类的拓展 | 类名+项目简写+extra | 例子: NSString+DDFExtra |
类 | 要求 | 例如 |
---|---|---|
宏定义方法 | 小驼峰命名 | 例子: getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",DDFBaseUrl,url]] |
宏定义常量 | 遵循大驼峰命名(开头以项目简写) | 例子:#define DDFWidth self.frame.size.width, KScreenWidth [UIScreen mainScreen].bouds.size.width |
要求 | 例如 |
---|---|
用修饰+类型的方式 (小驼峰式命名) | UIButton *settingButton |
要求 | 例如 |
---|---|
小驼峰式命名 | @property (strong, nonatomic) NSSNumber *userId; |
NSString 使用copy | @property (copy, nonatomic) NSString *userName; |
所有属性特性应该显式地列出来 | @property (weak, nonatomic) IBOutlet UIView *containerView; |
要求 | 例如 |
---|---|
功能名称_____控件类型 ___自定义参数 | share_____btn _weixin |
typedef NS_ENUM(NSInteger, DDFRequestState) {
DDFRequestStateInactive,
DDFRequestStateLoading
};
使用小驼峰法,规范的方法名应该看起来像一个完整的句子,读过便知函数作用。
在(-/+ )符号之后应加上一个空格
- (void)setExampleText:(NSString *)text image:(UIImage *)image;
+ (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (BOOL)tableView:(NSTableView*)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender
openFile:(NSString *)filename;
- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;
#pragma mark -
来分类方法,要遵循以下一般结构:
#pragma mark - lazy
- (NSArray *)array {
if(!_array) {
}
return _array;
}
#pragma mark - Lifecycle
- (instancetype)init {}
- (void)dealloc {}
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)didReceiveMemoryWarning {}
#pragma mark - Private
- (void)privateMethod {}
#pragma mark - NSCopying
- (void)didReceiveNotification {}
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate
#pragma mark - Custom Accessors
- (void)setCustomProperty:(id)value {}
- (id)customProperty {}
#pragma mark - Public
- (void)publicMethod {}
#pragma mark - IBActions
- (IBAction)submitData:(id)sender {}
NSInteger arrayCount = self.array.count;
view.backgroundColor = [UIColor orangeColor];
[UIApplication sharedApplication].delegate;
NSInteger arrayCount = [self.array count];
[view setBackgroundColor:[UIColor orangeColor]];
[[UIApplication sharedApplication] delegate];
- (void)methodName:(NSString *)string;
if (a < b) {
// something
}
(someValue > 100)? YES : NO
NSString
,NSDictionary
,NSArray
和NSNumber
等对象的immutable
实例时,应使用字面量。需要注意的是,不应将nil
传递给NSArray
和NSDictionary
字面量,否则会引起程序崩溃。NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingZIPCode = @10018;
case
语句中并不是必须的,除非编译器强制要求。当一个case
语句包含多行代码时,大括号应该加上。switch (condition) {
case 1:
// ...
break;
case 2: {
// ...
// Multi-line example using braces
break;
}
case 3:
// ...
break;
default:
// ...
break;
}
cases
使用时,一个fall-through
应该被使用。一个fall-through
就是在case
最后移除break
语句,这样就能够允许执行流程跳转到下一个case
值。为了代码更加清晰,一个fall-through
需要注释一下。switch (condition) {
case 1:
// ** fall-through! **
case 2:
// code executed for values 1 and 2
break;
default:
// ...
break;
}
nil
将被解析为NO
,因此没有必要在条件语句中进行比较。永远不要将任何东西和YES
进行直接比较,因为YES被定义为1,而一个BOOL
变量可以有8个字节。if (someObject) {}
if (![anotherObject boolValue]) {}
is
"前缀,但要指定get访问器的惯用名称。例如:@property (assign, getter=isEditable) BOOL editable;
if (!error) {
return success;
}
if (!error)
return success;
if (!error) return success;
result = a > b ? x : y;
result = a > b ? x = c > d ? c : d : y;
当需要注释时,注释应该用来解释这段特殊代码为什么要这样做。任何被使用的注释都必须保持最新或被删除。
一般都避免使用块注释,因为代码尽可能做到自解释,只有当断断续续或几行代码时才需要注释。例外:这不应用在生成文档的注释
参考资料 https://www.jianshu.com/p/3508672f26ae 参考这篇文章、为了统一删除部分文字。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。