{"id":20247620,"url":"https://github.com/qmui/qmui_ios_codesnippets","last_synced_at":"2026-01-26T13:03:07.018Z","repository":{"id":41827635,"uuid":"67987979","full_name":"QMUI/QMUI_iOS_CodeSnippets","owner":"QMUI","description":"用于Xcode使用的iOS通用代码片段，其中也包含若干专用于QMUI iOS框架的代码片段。","archived":false,"fork":false,"pushed_at":"2021-11-29T11:58:38.000Z","size":89,"stargazers_count":1094,"open_issues_count":1,"forks_count":237,"subscribers_count":28,"default_branch":"master","last_synced_at":"2025-03-03T15:48:15.154Z","etag":null,"topics":["code-snippets","qmui","xcode"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/QMUI.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-12T07:51:51.000Z","updated_at":"2025-02-26T07:51:39.000Z","dependencies_parsed_at":"2022-07-12T18:18:22.998Z","dependency_job_id":null,"html_url":"https://github.com/QMUI/QMUI_iOS_CodeSnippets","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/QMUI/QMUI_iOS_CodeSnippets","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QMUI%2FQMUI_iOS_CodeSnippets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QMUI%2FQMUI_iOS_CodeSnippets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QMUI%2FQMUI_iOS_CodeSnippets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QMUI%2FQMUI_iOS_CodeSnippets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/QMUI","download_url":"https://codeload.github.com/QMUI/QMUI_iOS_CodeSnippets/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QMUI%2FQMUI_iOS_CodeSnippets/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28778732,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T11:46:04.308Z","status":"ssl_error","status_checked_at":"2026-01-26T11:46:02.664Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-snippets","qmui","xcode"],"created_at":"2024-11-14T09:38:17.989Z","updated_at":"2026-01-26T13:03:06.994Z","avatar_url":"https://github.com/QMUI.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# qmui-ios-codesnippets \n*qmui-ios-codesnippets* 是一个 QMUI 团队日常工作中整理出来的用于 Xcode 的 iOS 通用代码片段集，其中也包含若干专用于 QMUI for iOS 框架的代码片段。\n\n整理这个代码片段集的初衷有以下几点：\n\n1. 我们发现由于 Xcode 本身的功能不足，导致我们经常在重写一些系统父类方法时容易忘了调用 `super`，从而出现一些很难排查的诡异bug。\n2. Xcode 虽然有模糊匹配的代码提醒，但代码提醒只能帮你写方法名，而code snippets 还可以帮你填充一些默认的方法实现，或者直接移动光标到方法体内，省去几次光标操作。\n3. 一些常用的写法本身语法可能比较复杂，难以记忆，例如实现一个类的单例、使用 `swizzle` 来重写系统控件的方法、block 在不同地方的语法不同等。\n4. 一些代码本身看似简单，但由于特别常用，所以使用 code snippets 可以大大节省时间。\n\n\n## 使用方式\nXcode 的 Code Snippets 文件存放于 `~/Library/Developer/Xcode/UserData/CodeSnippets` 目录，只要直接把 `*.codesnippets` 文件放到这个目录下（若没有则自己创建），重启 Xcode 即可生效。\n\n为了方便更新，建议直接将 QMUI iOS CodeSnippets clone 到这个目录内（注意，不是在 CodeSnippets 里创建一个 QMUI 的目录，这里不支持子目录）：\n```bash\ncd ~/Library/Developer/Xcode/UserData/CodeSnippets\n```\nCodeSnippets 目录为空:\n```bash\ngit clone https://github.com/QMUI/QMUI_iOS_CodeSnippets.git ./\n```\nCodeSnippets 目录不为空:\n```bash\ngit init .\ngit remote add origin https://github.com/QMUI/QMUI_iOS_CodeSnippets.git\ngit pull origin master \n```\n\n其中以 `QM_` 前缀开头的文件是通用的 Code Snippets，以 `QMUI_` 前缀开头的文件是专用于 `QMUI for iOS` 框架的代码片段。在下方的快捷键汇总里，QMUI 的代码片段将会以QMUI的形式标记出来。\n\n注意，Xcode 对每一段 Code Snippet 都有规定适用的语言（Objective-C、Objective-C++、Swift、...）和作用域（如 Class 的 Interface 定义内、Class 的 Implementation 内、方法体内、...），所以测试某段 Code Snippet 不生效时请注意你当前是否处于不匹配的位置。\n\n## 快捷键汇总\n*NSObject*\n- `pa` - 定义一个 `assign` 的 property\n- `par` - 定义一个 `assign, readonly` 的 property\n- `pc` - 定义一个 `copy` 的 property\n- `pcr` - 定义一个 `copy, readonly` 的 property\n- `ps` - 定义一个 `strong` 的property\n- `psr` - 定义一个 `strong, readonly` 的property\n- `pw` - 定义一个 `weak` 的property\n- `pwr` - 定义一个 `weak, readonly` 的property\n- `load_once` - 创建一个带 `dispatch_once` 的 `+load` 方法\n- `propertySwizzleAssign` - 用 `swizzle` 的方式定义一个 `assign` 的property\n- `propertySwizzleCopy` - 用 `swizzle` 的方式定义一个 `copy` 的property\n- `propertySwizzleStrong` - 用 `swizzle` 的方式定义一个 `strong` 的property\n- `propertySwizzleWeak` - 用 `swizzle` 的方式定义一个 `weak` 的property\n- `sharedInstance` - 为当前类创建一个实现单例功能的 `sharedInstance` 方法\n- `exchangeImplementation` - 重写当前类的 `load` 方法并在其中用 `swizzle` 替换方法实现\n- `exchangeImplementation_QMUI` - 用 QMUI 重写当前类的 `load` 方法并用 `ExchangeImplementations()` 函数替换方法的实现\n- `exchangeMultipleImplementations_QMUI` - 用 QMUI 重写当前类的 `load` 方法并用 `ExchangeImplementations()` 函数批量替换多个方法的实现\n- `override_void_non_argv` - 用 QMUI 的 `OverrideImplementation()` 重写指定 class 的某个无返回值、无参数的方法实现\n- `override_void_single_argv` - 用 QMUI 的 `OverrideImplementation()` 修改指定 class 的某个无返回值、带一个参数的方法实现\n- `override_void_two_argvs` - 用 QMUI 的 `OverrideImplementation()` 修改指定 class 的某个无返回值、带两个参数的方法实现\n- `override_return_non_argv` - 用 QMUI 的 `OverrideImplementation()` 修改指定 class 的某个带返回值、无参数的方法实现\n- `override_return_single_argv` - 用 QMUI 的 `OverrideImplementation()` 修改指定 class 的某个带返回值、带一个参数的方法实现\n- `override_return_two_argvs` - 用 QMUI 的 `OverrideImplementation()` 修改指定 class 的某个带返回值、带两个参数的方法实现\n- `extend_void_non_argv` - 用 QMUI 的 `ExtendImplementationOfVoidMethodWithoutArguments()` 修改指定 class 的某个无返回值、无参数的方法实现\n- `extend_void_single_argv` - 用 QMUI 的 `ExtendImplementationOfVoidMethodWithSingleArgument()` 修改指定 class 的某个无返回值、带一个参数的方法实现\n- `extend_void_two_argvs` - 用 QMUI 的 `ExtendImplementationOfVoidMethodWithTwoArguments()` 修改指定 class 的某个无返回值、带两个参数的方法实现\n- `extend_return_non_argv` - 用 QMUI 的 `ExtendImplementationOfNonVoidMethodWithoutArguments()` 修改指定 class 的某个带返回值、无参数的方法实现\n- `extend_return_single_argv` - 用 QMUI 的 `ExtendImplementationOfNonVoidMethodWithSingleArgument()` 修改指定 class 的某个带返回值、带一个参数的方法实现\n- `extend_return_two_argvs` - 用 QMUI 的 `ExtendImplementationOfNonVoidMethodWithTwoArguments()` 修改指定 class 的某个带返回值、带两个参数的方法实现\n\n\n*Block*\n- `blockParameterInMethod` - 声明一个用于 OC 方法参数的 block\n- `blockParameterInFunction` - 声明一个用于 C 函数参数的 block\n- `blockproperty` - 声明一个用于 property 的 block\n- `blocktypedef` - 用 `typedef` 定义一个 block\n- `blockvar` - 定义一个作为局部变量的 block\n\n\n*Method \u0026 Function*\n- `fnv` - 定义一个返回值为 `void` 的方法\n- `fnv:` - 定义一个返回值为 `void` 且带参数的方法\n- `fnblock` - 定义一个返回值类型为 block 的方法\n- `fnv_handleEvent` - 定义一个用于 `UIControl` 事件回调的方法\n- `fnv_longPress` - 定义一个用于 `UILongPressGestureRecognizer` 的回调方法（你就不用每次都去拼写那个很长的手势名字了）\n- `fnv_pan` - 定义一个用于 `UIPanGestureRecognizer` 的回调方法\n- `fnv_tap` - 定义一个用于 `UITapGestureRecognizer` 的回调方法\n\n\n*UIView*\n- `setFrame` - 为 `UIView` 设置 `frame`\n- `setFrame_QMUI` - QMUI 使用像素对齐的 `CGRectFlatMake()` 为 `UIView` 设置 `frame`\n- `setFrameX` - QMUI 使用 `CGRectSetX()` 修改 `UIView` 的 `frame.origin.x`\n- `setFrameY` - QMUI 使用 `CGRectSetY()` 修改 `UIView` 的 `frame.origin.y`\n- `setFrameXY` - QMUI 使用 `CGRectSetXY()` 修改 `UIView` 的 `frame.origin`\n- `sizeThatFits` - 为当前 view 创建 `sizeThatFits:` 方法\n- `layoutSubviews` - 展开 `layoutSubviews` 方法\n- `updateConstraints` - 展开 `updateConstraints` 方法\n- `getWidth` - 展开 `CGRectGetWidth()`\n- `getHeight` - 展开 `CGRectGetHeight()`\n- `getMinX` - 展开 `CGRectGetMinX()`\n- `getMinY` - 展开 `CGRectGetMinY()`\n- `addtarget` - 调用 `UIControl addTarget:action:forEvents:` 方法\n- `setImageForButton` - 为 `UIButton` 设置图片\n- `setTitleColorForButton` - 为 `UIButton` 设置文字颜色\n- `setTitleForButton` - 为 `UIButton` 设置文字\n\n*UITableView*\n- `initWithStyle` - 展开 `initWithStyle:` 方法\n- `initWithStyleForCell` - 展开 `UITableViewCell initWithStyle:reuseIdentifier:` 方法\n- `tableViewDelegate` - 展开常用的几个 `UITableViewDelegate` 方法\n- `numberOfSectionsInTableView` - 展开 `numberOfSectionsInTableView:`方法\n- `numberOfRowsInSection` - 展开 `tableView:numberOfRowsInSection:` 方法\n- `cellForRowAtIndexPath` - 展开 `tableView:cellForRowAtIndexPath:` 方法\n- `heightForRowAtIndexPath` - 展开 `tableView:heightForRowAtIndexPath:` 方法\n- `didSelectRowAtIndexPath` - 展开 `tableView:didSelectRowAtIndexPath:` 方法\n\n\n*UICollectionView*\n- `collectionViewDelegate` - 展开常用的几个`UICollectionViewDelegate` 方法\n- `numberOfSectionsInCollectionView` - 展开 `numberOfSectionsInCollectionView:`\n- `numberOfItemsInSection` - 展开 `collectionView:numberOfItemsInSection:`\n- `cellForItemAtIndexPath` - 展开 `collectionView:cellForItemAtIndexPath:`\n- `sizeForItemAtIndexPath` - 展开 `collectionView:layout:sizeForItemAtIndexPath:` 方法\n- `didSelectItemAtIndexPath` - 展开 `collectionView:didSelectItemAtIndexPath:` 方法\n- `didDeselectItemAtIndexPath` - 展开 `collectionView:didDeselectItemAtIndexPath:` 方法\n\n\n*UIViewController*\n- `initWithNib` - 展开 `initWithNibName:bundle:` 方法\n- `didInitialize` - 展开某些 QMUI 控件提供的 `didInitialize` 方法\n- `didInitializeWithStyle` - 展开 QMUICommonTableViewController 的 `didInitializeWithStyle:` 方法\n- `loadView` - 展开 `loadView` 方法\n- `viewDidLoad` - 展开 `viewDidLoad` 方法\n- `viewWillAppear` - 展开 `viewWillAppear:` 方法\n- `viewDidAppear` - 展开 `viewDidAppear:` 方法\n- `viewWillDisappear` - 展开 `viewWillDisappear:` 方法\n- `viewDidDisappear` - 展开 `viewDidDisappear:` 方法\n- `viewDidLayoutSubviews` - 展开 `viewDidLayoutSubviews:` 方法\n- `updateViewConstraints` - 展开 `updateViewConstraints:` 方法\n- `addChildViewController` - 在当前 `UIViewController` 里添加 `childViewController`\n- `removeFromParentViewController` - 将 `childViewController` 从当前的 `UIViewController` 里移除\n- `initSubviews` - QMUI 展开 `initSubviews` 方法\n- `setupNavigationItems` - QMUI 重写 `QMUICommonViewController` 里的 `setupNavigationItems` 方法\n- `setupToolbarItems` - QMUI 重写 `QMUICommonViewController` 里的 `setupToolbarItems` 方法\n\n*UIBarButtonItem*\n- `backItem` - 用 QMUI 方法生成一个返回按钮\n- `boldTitleItem` - 用 QMUI 方法生成一个文字加粗的导航栏按钮\n- `closeItem` - 用 QMUI 方法生成一个导航栏上的关闭图标按钮\n- `imageItem` - 用 QMUI 方法生成一个导航栏上的图片按钮\n- `titleItem` - 用 QMUI 方法生成一个导航栏上的文字按钮\n\n\n*Other*\n- `pragma` - 展开一个用于 Xcode 导航的 `#pragma mark -` 宏\n- `log` - 展开 `NSLog(@\"xxx\")`\n- `osif` - 展开一个 @available(iOS xxx, \\*) 的 if 判断\n- `externRefInH` - 在 `*.h` 文件里声明一个 `extern const` 的指针\n- `externRefInM` - 在 `*.m` 文件里为一个 `extern const` 的指针赋值\n- `externValueInH` - 在 `*.h` 文件里声明一个 `extern const` 的值变量\n- `externValueInM` - 在 `*.m` 文件里为一个 `extern const` 的变量赋值\n- `static reference` - 定义一个 `static` 的指针\n- `static` - 定义一个 `static` 的值变量\n- `__weakSelf` - 定义一个 `weak` 的 `self` 指针\n- `__strongSelf` - 将 `weakSelf` 指针改为 `strong` 的 `self` 指针\n- `logCallStackSymbols` - 用 `NSLog` 打出当前的方法调用栈信息\n- `timeConsuming` - 展开一段用 `CACurrentMediaTime()` 来计算方法耗时的代码\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqmui%2Fqmui_ios_codesnippets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqmui%2Fqmui_ios_codesnippets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqmui%2Fqmui_ios_codesnippets/lists"}