QMUI iOS CodeSnippets
用于Xcode使用的iOS通用代码片段,其中也包含若干专用于QMUI iOS框架的代码片段。
*qmui-ios-codesnippets* 是一个 QMUI 团队日常工作中整理出来的用于 Xcode 的 iOS 通用代码片段集,其中也包含若干专用于 QMUI for iOS 框架的代码片段。 The project is distributed under the MIT License license, first published in 2016. It has gained significant community traction with 1,093 stars and 232 forks on GitHub. Key topics include: code-snippets, qmui, xcode.
qmui-ios-codesnippets
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 的目录,这里不支持子目录):
bashcd ~/Library/Developer/Xcode/UserData/CodeSnippets
CodeSnippets 目录为空:
bashgit clone https://github.com/QMUI/QMUI_iOS_CodeSnippets.git ./
CodeSnippets 目录不为空:
bashgit 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的 propertypar- 定义一个assign, readonly的 propertypc- 定义一个copy的 propertypcr- 定义一个copy, readonly的 propertyps- 定义一个strong的propertypsr- 定义一个strong, readonly的propertypw- 定义一个weak的propertypwr- 定义一个weak, readonly的propertyload_once- 创建一个带dispatch_once的+load方法propertySwizzleAssign- 用swizzle的方式定义一个assign的propertypropertySwizzleCopy- 用swizzle的方式定义一个copy的propertypropertySwizzleStrong- 用swizzle的方式定义一个strong的propertypropertySwizzleWeak- 用swizzle的方式定义一个weak的propertysharedInstance- 为当前类创建一个实现单例功能的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 方法参数的 blockblockParameterInFunction- 声明一个用于 C 函数参数的 blockblockproperty- 声明一个用于 property 的 blockblocktypedef- 用typedef定义一个 blockblockvar- 定义一个作为局部变量的 block
Method & Function
fnv- 定义一个返回值为void的方法fnv:- 定义一个返回值为void且带参数的方法fnblock- 定义一个返回值类型为 block 的方法fnv_handleEvent- 定义一个用于UIControl事件回调的方法fnv_longPress- 定义一个用于UILongPressGestureRecognizer的回调方法(你就不用每次都去拼写那个很长的手势名字了)fnv_pan- 定义一个用于UIPanGestureRecognizer的回调方法fnv_tap- 定义一个用于UITapGestureRecognizer的回调方法
UIView
setFrame- 为UIView设置framesetFrame_QMUI- QMUI 使用像素对齐的CGRectFlatMake()为UIView设置framesetFrameX- QMUI 使用CGRectSetX()修改UIView的frame.origin.xsetFrameY- QMUI 使用CGRectSetY()修改UIView的frame.origin.ysetFrameXY- QMUI 使用CGRectSetXY()修改UIView的frame.originsizeThatFits- 为当前 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里添加childViewControllerremoveFromParentViewController- 将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()来计算方法耗时的代码
Contributors
Showing top 3 contributors by commit count.
