博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
R.swift-优雅地引用项目资源
阅读量:7222 次
发布时间:2019-06-29

本文共 5532 字,大约阅读时间需要 18 分钟。

R.swift是一个高效引入iOS资源的框架,避免了使用字符串引入资源文件导致程序崩溃的尴尬。 目前R.swift支持到Swift4.0版本

优势

使用代码的方式来引入资源:

  • 类型完整: 减少推断和转换方法返回值的类型
  • 编译时检查: 不会再因为不正确的字符串导致App产生运行时崩溃
  • 自动补全: 不再需要输入图片名称

示例:

之前:

let image = UIImage(named: "imageName")复制代码

R.swift:

let image = R.image.imageName()复制代码

功能

使用R.swift之后,可以使用R结构体来获取资源文件。如若资源文件发生改变,R.swift会正确的清除\改变\增加资源。

R.swift目前支持如下几种资源:

  • Images
  • Fonts
  • Resource files
  • Colors
  • Localized String
  • StoryBoard
  • Segues
  • Nibs
  • Reuseable cells

接入方式

CocoaPods

  1. 添加pod R.swiftPodfile文件中之后终端执行pod install
  2. Xcode配置:在当前项目的targets中选择Build phrase,点击+号选择添加New Run Script Phase,
  3. Run Script移动至Compile sources之上,Check Pods Manifest.lock之下。在Run Script中添加:"$PODS_ROOT/R.swift/rswift" "$SRCROOT",
  4. 编译你的项目,在Finder中你会看到R.generated.swiftPod文件中,将该文件拖动至项目中,切记千万不要勾选Copy items if needed,
  5. 新增\删除\修改资源文件之后都需要重新command+B编译项目,保证正确引用。

使用方式

1、Images

之前:

let png = UIImage(named: "png")let jpg = UIImage(named: "jpg.jpg")复制代码

R.swift:

let png = R.image.png()let jpg = R.imgae.jpgJpg()复制代码

2、Custom fonts

之前:

let customFont = UIFont(name: "Acme-Light", size: 22)复制代码

R.swift:

let customFont = R.font.acmeLight(size: 22)复制代码

3、Resource files

之前 :

let jsonURL = Bundle.main.url(forResource: "seed-data", withExtension: "json")let jsonPath = Bundle.main.path(forResource: "seed-data", ofType: "json")复制代码

R.swift:

let jsonURL = R.file.seedDataJson()let jsonPath = R.file.seedDataJson.path()复制代码

4、Localized Strings

之前:

let welcomeMessage = NSLocalizedString("welcome.message", comment: "")let settingsTitle = NSLocalizedString("title", tableName: "Settings", comment: "")let welcomeName = String(format: NSLocalizedString("welcome.withName", comment: ""), locale: NSLocale.current, "Alice")let progress = String(format: NSLocalizedString("copy.progress", comment: ""), locale: NSLocale.current, 4, 23)复制代码

R.swift:

let welcomeMessage = R.string.localizable.welcomeMessage()let settingsTitle = R.string.settings.title()let welcomeName = R.string.localizable.welcomeWithName("Alice")let progress = R.string.localizable.copyProgress(completed: 4, total: 23)复制代码

5、Segues

之前:

performSegue(withIdentifier: "openSettings", sender: self)override func prepare(for segue: UIStoryboardSegue, sender: Any?) {    if let settingsController = segue.destination as? SettingsController,       let segue = segue as? CustomSettingsSegue, segue.identifier == "openSettings" {      segue.animationType = .LockAnimation      settingsController.lockSettings = true    }  }复制代码

R.swift:

performSegue(withIdentifier: R.segue.overviewController.openSettings, sender: self)override func prepare(for segue: UIStoryboardSegue, sender: Any?) {  if let typedInfo = R.segue.overviewController.openSettings(segue: segue) {    typedInfo.segue.animationType = .LockAnimation    typedInfo.destinationViewController.lockSettings = true  }复制代码

6、Nibs

之前:

let nameOfNib = "CustomView"let customViewNib = UINib(nibName: "CustomView", bundle: nil)let rootViews = customViewNib.instantiate(withOwner: nil, options: nil)let customView = rootViews[0] as? CustomViewlet viewControllerWithNib = CustomViewController(nibName: "CustomView", bundle: nil)复制代码

R.swift:

let nameOfNib = R.nib.customView.namelet customViewNib = R.nib.customView()let rootViews = R.nib.customView.instantiate(withOwner: nil)let customView = R.nib.customView.firstView(owner: nil)let viewControllerWithNib = CustomViewController(nib: R.nib.customView)复制代码

7、Reusable table view cells

UITableView

之前:

class FaqAnswerController: UITableViewController {  override func viewDidLoad() {    super.viewDidLoad()    let textCellNib = UINib(nibName: "TextCell", bundle: nil)    tableView.register(textCellNib, forCellReuseIdentifier: "TextCellIdentifier")  }  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    let textCell = tableView.dequeueReusableCell(withIdentifier: "TextCellIdentifier", for: indexPath) as! TextCell    textCell.mainLabel.text = "Hello World"    return textCell  }}复制代码

R.swift:

class FaqAnswerController: UITableViewController {  override func viewDidLoad() {    super.viewDidLoad()    tableView.register(R.nib.textCell)  }  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    let textCell = tableView.dequeueReusableCell(withIdentifier: R.nib.textCell.identifier, for: indexPath)!    textCell.mainLabel.text = "Hello World"    return textCell  }}复制代码

UICollectionView

之前:

class RecentsController: UICollectionViewController {  override func viewDidLoad() {    super.viewDidLoad()    let talkCellNib = UINib(nibName: "TalkCell", bundle: nil)    collectionView?.register(talkCellNib, forCellWithReuseIdentifier: "TalkCellIdentifier")  }  override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TalkCellIdentifier", for: indexPath) as! TalkCell    cell.configureCell("Item \(indexPath.item)")    return cell  }}复制代码

R.swift:

class RecentsController: UICollectionViewController {  override func viewDidLoad() {    super.viewDidLoad()    collectionView?.register(R.nib.talkCell)  }  override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: R.reuseIdentifier.talkCell, for: indexPath)! // 此处跟tableView的使用方式还是有很大区别    cell.configureCell("Item \(indexPath.item)")    return cell  }}复制代码

相关链接

转载于:https://juejin.im/post/5cca59f9518825418e302df6

你可能感兴趣的文章
WebSocket 实战
查看>>
二次排序
查看>>
CSS:如何清除a标签之间的默认留白间距
查看>>
selenium随笔
查看>>
leetcode599
查看>>
String类中“==”和“equals()”的区别
查看>>
leetcode--883
查看>>
the application could not be verified
查看>>
[转]Centos配置国内yum源
查看>>
redis数据类型和应用场景
查看>>
Spring IOC
查看>>
Fragment的onCreateView和onActivityCreate之间的区别(转)
查看>>
AC日记——统计难题 hdu 1251
查看>>
在仿真器中运行时跳过Windows Azure Startup任务
查看>>
android 获取路径目录方法以及判断目录是否存在,创建目录
查看>>
数列问题[HAOI2004模拟]
查看>>
2012各大IT公司校招笔试题整理
查看>>
phpcms 后台分页
查看>>
《需求工程》阅读笔记之六
查看>>
架构阅读笔记5
查看>>