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
到这个目录内。其中以 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
的 propertypc
- 定义一个copy
的 propertyps
- 定义一个strong
的propertypsr
- 定义一个strong, readonly
的propertypw
- 定义一个weak
的propertypropertySwizzleAssign
- 用swizzle
的方式定义一个assign
的propertypropertySwizzleCopy
- 用swizzle
的方式定义一个copy
的propertypropertySwizzleStrong
- 用swizzle
的方式定义一个strong
的propertypropertySwizzleWeak
- 用swizzle
的方式定义一个weak
的propertysharedInstance
- 为当前类创建一个实现单例功能的sharedInstance
方法replaceMethod
- 重写当前类的load
方法并在其中用swizzle
替换方法实现replaceMethod_QMUI
- QMUI 重写当前类的load
方法并用ReplaceMethod()
函数替换方法的实现
Block
blockArguments
- 声明一个用于方法参数的 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
设置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
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
方法setNavigationItems
- QMUI 重写QMUICommonViewController
里的setNavigationItemsIsInEditMode:animated:
方法setToolbarItems
- QMUI 重写QMUICommonViewController
里的setToolbarItemsIsInEditMode:animated:
方法leftBarButtonItemImage
- QMUI 用QMUINavigationButton
的方法创建一个用于navigationItem.leftBarButtonItem
的UIBarButtonItem
rightBarButtonItemImage
- QMUI 用QMUINavigationButton
的方法创建一个用于navigationItem.rightBarButtonItem
的UIBarButtonItem
Other
pragma
- 展开一个用于 Xcode 导航的#pragma mark -
宏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()
来计算方法耗时的代码