qmui-ios-codesnippets 是一个 QMUI 团队日常工作中整理出来的用于 Xcode 的 iOS 通用代码片段集,其中也包含若干专用于 QMUI for iOS 框架的代码片段。
整理这个代码片段集的初衷有以下几点:
- 我们发现由于 Xcode 本身的功能不足,导致我们经常在重写一些系统父类方法时容易忘了调用 super,从而出现一些很难排查的诡异bug。
- Xcode 虽然有模糊匹配的代码提醒,但代码提醒只能帮你写方法名,而code snippets 还可以帮你填充一些默认的方法实现,或者直接移动光标到方法体内,省去几次光标操作。
- 一些常用的写法本身语法可能比较复杂,难以记忆,例如实现一个类的单例、使用 swizzle来重写系统控件的方法、block 在不同地方的语法不同等。
- 一些代码本身看似简单,但由于特别常用,所以使用 code snippets 可以大大节省时间。
Xcode 的 Code Snippets 文件存放于 ~/Library/Developer/Xcode/UserData/CodeSnippets 目录,只要直接把 *.codesnippets 文件放到这个目录下(若没有则自己创建),重启 Xcode 即可生效。
为了方便更新,建议直接将 QMUI iOS CodeSnippets clone 到这个目录内(注意,不是在 CodeSnippets 里创建一个 QMUI 的目录,这里不支持子目录):
cd ~/Library/Developer/Xcode/UserData/CodeSnippetsCodeSnippets 目录为空:
git clone https://github.com/QMUI/QMUI_iOS_CodeSnippets.git ./CodeSnippets 目录不为空:
git init .
git remote add origin https://github.com/QMUI/QMUI_iOS_CodeSnippets.git
git pull origin master 其中以 QM_ 前缀开头的文件是通用的 Code Snippets,以 QMUI_ 前缀开头的文件是专用于 QMUI for iOS 框架的代码片段。在下方的快捷键汇总里,QMUI 的代码片段将会以QMUI的形式标记出来。
注意,Xcode 对每一段 Code Snippet 都有规定适用的语言(Objective-C、Objective-C++、Swift、...)和作用域(如 Class 的 Interface 定义内、Class 的 Implementation 内、方法体内、...),所以测试某段 Code Snippet 不生效时请注意你当前是否处于不匹配的位置。
NSObject
- pa- 定义一个- assign的 property
- par- 定义一个- assign, readonly的 property
- pc- 定义一个- copy的 property
- pcr- 定义一个- copy, readonly的 property
- ps- 定义一个- strong的property
- psr- 定义一个- strong, readonly的property
- pw- 定义一个- weak的property
- pwr- 定义一个- weak, readonly的property
- load_once- 创建一个带- dispatch_once的- +load方法
- propertySwizzleAssign- 用- swizzle的方式定义一个- assign的property
- propertySwizzleCopy- 用- swizzle的方式定义一个- copy的property
- propertySwizzleStrong- 用- swizzle的方式定义一个- strong的property
- propertySwizzleWeak- 用- swizzle的方式定义一个- weak的property
- sharedInstance- 为当前类创建一个实现单例功能的- sharedInstance方法
- exchangeImplementation- 重写当前类的- load方法并在其中用- swizzle替换方法实现
- exchangeImplementation_QMUI- 用 QMUI 重写当前类的- load方法并用- ExchangeImplementations()函数替换方法的实现
- exchangeMultipleImplementations_QMUI- 用 QMUI 重写当前类的- load方法并用- ExchangeImplementations()函数批量替换多个方法的实现
- override_void_non_argv- 用 QMUI 的- OverrideImplementation()重写指定 class 的某个无返回值、无参数的方法实现
- override_void_single_argv- 用 QMUI 的- OverrideImplementation()修改指定 class 的某个无返回值、带一个参数的方法实现
- override_void_two_argvs- 用 QMUI 的- OverrideImplementation()修改指定 class 的某个无返回值、带两个参数的方法实现
- override_return_non_argv- 用 QMUI 的- OverrideImplementation()修改指定 class 的某个带返回值、无参数的方法实现
- override_return_single_argv- 用 QMUI 的- OverrideImplementation()修改指定 class 的某个带返回值、带一个参数的方法实现
- override_return_two_argvs- 用 QMUI 的- OverrideImplementation()修改指定 class 的某个带返回值、带两个参数的方法实现
- extend_void_non_argv- 用 QMUI 的- ExtendImplementationOfVoidMethodWithoutArguments()修改指定 class 的某个无返回值、无参数的方法实现
- extend_void_single_argv- 用 QMUI 的- ExtendImplementationOfVoidMethodWithSingleArgument()修改指定 class 的某个无返回值、带一个参数的方法实现
- extend_void_two_argvs- 用 QMUI 的- ExtendImplementationOfVoidMethodWithTwoArguments()修改指定 class 的某个无返回值、带两个参数的方法实现
- extend_return_non_argv- 用 QMUI 的- ExtendImplementationOfNonVoidMethodWithoutArguments()修改指定 class 的某个带返回值、无参数的方法实现
- extend_return_single_argv- 用 QMUI 的- ExtendImplementationOfNonVoidMethodWithSingleArgument()修改指定 class 的某个带返回值、带一个参数的方法实现
- extend_return_two_argvs- 用 QMUI 的- ExtendImplementationOfNonVoidMethodWithTwoArguments()修改指定 class 的某个带返回值、带两个参数的方法实现
Block
- blockParameterInMethod- 声明一个用于 OC 方法参数的 block
- blockParameterInFunction- 声明一个用于 C 函数参数的 block
- blockproperty- 声明一个用于 property 的 block
- blocktypedef- 用- typedef定义一个 block
- blockvar- 定义一个作为局部变量的 block
Method & Function
- fnv- 定义一个返回值为- void的方法
- fnv:- 定义一个返回值为- void且带参数的方法
- fnblock- 定义一个返回值类型为 block 的方法
- fnv_handleEvent- 定义一个用于- UIControl事件回调的方法
- fnv_longPress- 定义一个用于- UILongPressGestureRecognizer的回调方法(你就不用每次都去拼写那个很长的手势名字了)
- fnv_pan- 定义一个用于- UIPanGestureRecognizer的回调方法
- fnv_tap- 定义一个用于- UITapGestureRecognizer的回调方法
UIView
- setFrame- 为- UIView设置- frame
- setFrame_QMUI- QMUI 使用像素对齐的- CGRectFlatMake()为- UIView设置- frame
- setFrameX- QMUI 使用- CGRectSetX()修改- UIView的- frame.origin.x
- setFrameY- QMUI 使用- CGRectSetY()修改- UIView的- frame.origin.y
- setFrameXY- QMUI 使用- CGRectSetXY()修改- UIView的- frame.origin
- sizeThatFits- 为当前 view 创建- sizeThatFits:方法
- layoutSubviews- 展开- layoutSubviews方法
- updateConstraints- 展开- updateConstraints方法
- getWidth- 展开- CGRectGetWidth()
- getHeight- 展开- CGRectGetHeight()
- getMinX- 展开- CGRectGetMinX()
- getMinY- 展开- CGRectGetMinY()
- addtarget- 调用- UIControl addTarget:action:forEvents:方法
- setImageForButton- 为- UIButton设置图片
- setTitleColorForButton- 为- UIButton设置文字颜色
- setTitleForButton- 为- UIButton设置文字
UITableView
- initWithStyle- 展开- initWithStyle:方法
- initWithStyleForCell- 展开- UITableViewCell initWithStyle:reuseIdentifier:方法
- tableViewDelegate- 展开常用的几个- UITableViewDelegate方法
- numberOfSectionsInTableView- 展开- numberOfSectionsInTableView:方法
- numberOfRowsInSection- 展开- tableView:numberOfRowsInSection:方法
- cellForRowAtIndexPath- 展开- tableView:cellForRowAtIndexPath:方法
- heightForRowAtIndexPath- 展开- tableView:heightForRowAtIndexPath:方法
- didSelectRowAtIndexPath- 展开- tableView:didSelectRowAtIndexPath:方法
UICollectionView
- collectionViewDelegate- 展开常用的几个- UICollectionViewDelegate方法
- numberOfSectionsInCollectionView- 展开- numberOfSectionsInCollectionView:
- numberOfItemsInSection- 展开- collectionView:numberOfItemsInSection:
- cellForItemAtIndexPath- 展开- collectionView:cellForItemAtIndexPath:
- sizeForItemAtIndexPath- 展开- collectionView:layout:sizeForItemAtIndexPath:方法
- didSelectItemAtIndexPath- 展开- collectionView:didSelectItemAtIndexPath:方法
- didDeselectItemAtIndexPath- 展开- collectionView:didDeselectItemAtIndexPath:方法
UIViewController
- initWithNib- 展开- initWithNibName:bundle:方法
- didInitialize- 展开某些 QMUI 控件提供的- didInitialize方法
- didInitializeWithStyle- 展开 QMUICommonTableViewController 的- didInitializeWithStyle:方法
- loadView- 展开- loadView方法
- viewDidLoad- 展开- viewDidLoad方法
- viewWillAppear- 展开- viewWillAppear:方法
- viewDidAppear- 展开- viewDidAppear:方法
- viewWillDisappear- 展开- viewWillDisappear:方法
- viewDidDisappear- 展开- viewDidDisappear:方法
- viewDidLayoutSubviews- 展开- viewDidLayoutSubviews:方法
- updateViewConstraints- 展开- updateViewConstraints:方法
- addChildViewController- 在当前- UIViewController里添加- childViewController
- removeFromParentViewController- 将- childViewController从当前的- UIViewController里移除
- initSubviews- QMUI 展开- initSubviews方法
- setupNavigationItems- QMUI 重写- QMUICommonViewController里的- setupNavigationItems方法
- setupToolbarItems- QMUI 重写- QMUICommonViewController里的- setupToolbarItems方法
UIBarButtonItem
- backItem- 用 QMUI 方法生成一个返回按钮
- boldTitleItem- 用 QMUI 方法生成一个文字加粗的导航栏按钮
- closeItem- 用 QMUI 方法生成一个导航栏上的关闭图标按钮
- imageItem- 用 QMUI 方法生成一个导航栏上的图片按钮
- titleItem- 用 QMUI 方法生成一个导航栏上的文字按钮
Other
- pragma- 展开一个用于 Xcode 导航的- #pragma mark -宏
- log- 展开- NSLog(@"xxx")
- osif- 展开一个 @available(iOS xxx, *) 的 if 判断
- externRefInH- 在- *.h文件里声明一个- extern const的指针
- externRefInM- 在- *.m文件里为一个- extern const的指针赋值
- externValueInH- 在- *.h文件里声明一个- extern const的值变量
- externValueInM- 在- *.m文件里为一个- extern const的变量赋值
- static reference- 定义一个- static的指针
- static- 定义一个- static的值变量
- __weakSelf- 定义一个- weak的- self指针
- __strongSelf- 将- weakSelf指针改为- strong的- self指针
- logCallStackSymbols- 用- NSLog打出当前的方法调用栈信息
- timeConsuming- 展开一段用- CACurrentMediaTime()来计算方法耗时的代码