Является ли какая-нибудь функция быстрой, похожей на R.java в Android?
Я начинаю работать в iOS и быстро.
Раньше я писал Android, и я думаю, что R.java - хорошая идея управлять идентификаторами, чертежами, строками и другими ресурсами.
Поэтому я удивлен, что iOS не обеспечивает хорошую функцию для доступа к ресурсам.
Если я хочу получить изображение из активов, я вызываю UIImage(named: "img_name")
, но я не думаю, что это лучший способ получить доступ к img_name
, я могу использовать неправильное имя, и я не могу получить изображение.
Я нашел проект с открытым исходным кодом, например Shark и SwiftGen, но Shark
поддерживает только изображения и SwiftGen
, кажется, что нужно выполнить команду не автоматически.
Есть ли у вас лучшее решение? Спасибо!
Ответы
Ответ 1
У меня есть проект с открытым исходным кодом R.swift-plugin он предоставляет функции, как вы упомянули. Вам просто нужно установить плагин Xcode через Alcatraz и искать R.swift
Плагин автоматически создаст файл ресурсов для управления вашими изображениями, локализуемыми строками и цветами, и вы сможете получить к ним доступ, например, используя R.java
Использование:
![введите описание изображения здесь]()
Искренне рекомендуем вам попробовать. И не стесняйтесь предлагать мне какое-либо предложение улучшить его:)
Ответ 2
-
Если вы используете InterfaceBuilder
(также называемый Storyboard
, xib
), нет необходимости определять идентификатор для каждого представления. Вы можете привязать выходы в коде.
-
Если вы хотите получать представления с помощью своих идентификаторов (например, R.java
по вашему запросу), вы можете установить тег для каждого представления и манипулировать ими в коде.
![введите описание изображения здесь]()
В отличие от AndroidStudio, Xcode будет не генерировать любой файл.
func viewDidLoad() {
let labelView = self.view.viewWithTag(0) as? UILabel
}
Ответ 3
В Xcode нет такой функции, но есть проект с открытым исходным кодом, который выполняет только это: R.swift
Он автоматически обновляет сгенерированный файл и поддерживает множество различных типов ресурсов, таких как изображения, шрифты, segues и т.д.
Ответ 4
У вас могут быть аналогичные функции, используя расширения и перечисления.
Использование перечислений позволяет избежать опечаток и извлечь выгоду из автосохранения Xcode/автозаполнения.
Пример для UIImage:
extension UIImage {
enum ImageId: String {
// These are your images NAMES,
// as in "SpriteMonster.jpg"
case SpriteMonster, SpriteHero, BaseLandscape
}
convenience init!(id: ImageId) {
self.init(named: id.rawValue)
}
}
Использование:
let monster = UIImage(id: .SpriteMonster) // the "SpriteMonster.jpg" image
В этом примере я принудительно разворачиваю удобство init, поэтому будьте осторожны, чтобы иметь изображение с правильным именем в вашем комплекте.
Для строки:
extension String {
enum StringId: String {
case Welcome = "Welcome to the game!"
case GameOver = "You loose! Game over!"
}
init(id: StringId) {
self = id.rawValue
}
}
Использование:
let label = String(id: .Welcome) // "Welcome to the game!"
Для шрифтов:
extension UIFont {
enum FontId {
case HelveticaNeueLarge
case HelveticaNeueMedium
case HelveticaNeueSmall
func font() -> UIFont {
switch self {
case .HelveticaNeueLarge:
return UIFont(name: "HelveticaNeue", size: 18)!
case .HelveticaNeueSmall:
return UIFont(name: "HelveticaNeue", size: 12)!
default:
return UIFont(name: "HelveticaNeue", size: 14)!
}
}
}
class func get(id: FontId) -> UIFont {
return id.font()
}
}
Использование:
let font = UIFont.get(.HelveticaNeueLarge) // <UICTFont: 0x7ffd38f09180> font-family: "Helvetica Neue"; font-weight: normal; font-style: normal; font-size: 18.00pt
Это только примеры для демонстрации концепции, вы можете пойти гораздо дальше с этим.