R.swift是一個高效引入iOS資源的框架,避免了使用字符串引入資源文件導致程序崩潰的尷尬。
目前R.swift支持到Swift3.0版本
優(yōu)勢
使用代碼的方式來引入資源:
- 類型完整: 減少推斷和轉(zhuǎn)換方法返回值的類型
- 編譯時檢查: 不會再因為不正確的字符串導致App產(chǎn)生運行時崩潰
- 自動補全: 不再需要輸入圖片名稱
示例:
之前:
let image = UIImage(named: "imageName")
R.swift:
let image = R.image.imageName()
功能
使用R.swift之后,可以使用R結(jié)構(gòu)體來獲取資源文件。如若資源文件發(fā)生改變,R.swift會正確的清除\改變\增加資源。
R.swift目前支持如下幾種資源:
- Images
- Fonts
- Resource files
- Colors
- Localized String
- StoryBoard
- Segues
- Nibs
- Reuseable cells
接入方式
CocoaPods
- 添加
pod R.swift至Podfile文件中之后終端執(zhí)行pod install -
Xcode配置:在當前項目的targets中選擇Build phrase,點擊+號選擇添加New Run Script Phase, - 將
Run Script移動至Compile sources之上,Check Pods Manifest.lock之下。在Run Script中添加:"$PODS_ROOT/R.swift/rswift" "$SRCROOT", - 編譯你的項目,在
Finder中你會看到R.generated.swift在Pod文件中,將該文件拖動至項目中,切記千萬不要勾選Copy items if needed, - 新增\刪除\修改資源文件之后都需要重新
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? CustomView
let viewControllerWithNib = CustomViewController(nibName: "CustomView", bundle: nil)
R.swift:
let nameOfNib = R.nib.customView.name
let 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的使用方式還是有很大區(qū)別
cell.configureCell("Item \(indexPath.item)")
return cell
}
}