Desbordamiento de pila. Esta es mi primera publicación. Disculpe cualquier problema con el formato.
He estado tratando de aprender algo sobre el desarrollo de iOS para crear una aplicación que me ayude en el trabajo (soy agricultor). No tengo una computadora Mac y no puedo obtener una actualmente, lo que significa que no tengo Xcode, pero tengo un iPad. Recientemente, Apple hizo posible desarrollar y publicar aplicaciones desde iPad en Swift Playgrounds.
Busqué en Internet tutoriales específicos de Playgrounds y no encontré muchas cosas, supongo que porque la funcionalidad es bastante nueva. Los mejores tutoriales de SwiftUI que encontré provienen de los tutoriales de desarrollo de aplicaciones iOS de Apple. Ahora estoy trabajando en el código de Scrumdinger y encontré un problema con los colores que se definieron dentro de una carpeta de Activos en Xcode desde archivos .json.
Por favor, consulte esta estructura para mi pregunta:
import Foundation struct DailyScrum { var title: String var attendees: [String] var lengthInMinutes: Int var theme: Theme } extension DailyScrum { static let sampleData: [DailyScrum] = [ DailyScrum(title: "Design", attendees: ["Cathy", "Daisy", "Simon", "Jonathan"], lengthInMinutes: 10, theme: .yellow), DailyScrum(title: "App Dev", attendees: ["Katie", "Gray", "Euna", "Luis", "Darla"], lengthInMinutes: 5, theme: .orange), DailyScrum(title: "Web Dev", attendees: ["Chella", "Chris", "Christina", "Eden", "Karla", "Lindsey", "Aga", "Chad", "Jenn", "Sarah"], lengthInMinutes: 5, theme: .poppy) ] }Este fragmento de código del tutorial de Apple
import SwiftUI struct CardView: View { let scrum: DailyScrum var body: some View { VStack(alignment: .leading) { Text(scrum.title) .font(.headline) Spacer() HStack { Label("\(scrum.attendees.count)", systemImage: "person.3") Spacer() Label("\(scrum.lengthInMinutes)", systemImage: "clock") .labelStyle(.trailingIcon) } .font(.caption) } .padding() .foregroundColor(scrum.theme.accentColor) } } struct CardView_Previews: PreviewProvider { static var scrum = DailyScrum.sampleData[0] static var previews: some View { CardView(scrum: scrum) .background(scrum.theme.mainColor) .previewLayout(.fixed(width: 400, height: 60)) } }se supone que genera esta vista previa en Xcode . Sin embargo, esto es lo que obtengo en iPad Playgrounds . Tanto el color como el tamaño de vista previa están desactivados. Realmente no me importa el tamaño de la vista previa, porque no afecta la aplicación (esta tarjeta se mostrará en una lista y tendrá el tamaño apropiado más adelante), pero me gustaría obtener el color correcto.
La estructura Theme que se usa para especificar los colores se define en el archivo Theme.swift :
import SwiftUI enum Theme: String { case bubblegum case buttercup case indigo case lavender case magenta case navy case orange case oxblood case periwinkle case poppy case purple case seafoam case sky case tan case teal case yellow var accentColor: Color { switch self { case .bubblegum, .buttercup, .lavender, .orange, .periwinkle, .poppy, .seafoam, .sky, .tan, .teal, .yellow: return .black case .indigo, .magenta, .navy, .oxblood, .purple: return .white } } var mainColor: Color { Color(rawValue) } }Y los colores especificados en la enumeración son activos .json en Xcode con esta estructura de carpetas . Sin embargo, el tutorial en línea no especifica cómo Xcode sabe buscarlos sin referencias explícitas a estas carpetas o archivos .json en el código de Theme.swift.
Traté de recrear la misma estructura de carpetas dentro de Playgrounds (lo cual fue doloroso ya que no puedes importar carpetas), pero mi salida no cambió.
Asi que aqui están mis preguntas:
Muchas gracias.
Siguiendo la sugerencia de @loremipsum, reemplacé la propiedad mainColor de la enumeración Theme con
var mainColor: Color { switch self { case .bubblegum: return Color(red: 0.933, green: 0.502, blue: 0.820) case .buttercup: return Color(red: 1.000, green: 0.945, blue: 0.588) case .indigo: return Color(red: 0.212, green: 0.000, blue: 0.443) case .lavender: return Color(red: 0.812, green: 0.808, blue: 1.000) case .magenta: return Color(red: 0.647, green: 0.075, blue: 0.467) case .navy: return Color(red: 0.000, green: 0.078, blue: 0.255) case .orange: return Color(red: 1.000, green: 0.545, blue: 0.259) case .oxblood: return Color(red: 0.290, green: 0.027, blue: 0.043) case .periwinkle: return Color(red: 0.525, green: 0.510, blue: 1.000) case .poppy: return Color(red: 1.000, green: 0.369, blue: 0.369) case .purple: return Color(red: 0.569, green: 0.294, blue: 0.949) case .seafoam: return Color(red: 0.796, green: 0.918, blue: 0.898) case .sky: return Color(red: 0.431, green: 0.573, blue: 1.000) case .tan: return Color(red: 0.761, green: 0.608, blue: 0.494) case .teal: return Color(red: 0.133, green: 0.561, blue: 0.620) case .yellow: return Color(red: 1.000, green: 0.875, blue: 0.302) } }copiando los valores RGB para los temas de los archivos de activos .json. Esto solucionó el problema y ahora los colores aparecen según lo previsto.
Lo que no entiendo es por qué SwiftUI no pudo procesar Color(rawValue) para los datos de ejemplo utilizados en CardView() , que fue DailyScrum(title: "Design", attendees: ["Cathy", "Daisy", "Simon", "Jonathan"], lengthInMinutes: 10, theme: .yellow) . Claro, es posible que .periwinkle no esté definido previamente, pero .yellow ciertamente lo está. De hecho, si reescribo mainColor de Color(rawValue) a Color(.yellow) , obtengo todas las tarjetas de color amarillo sin tener que pasar ningún valor RGB.
Entonces, ¿qué Color(rawValue) de la enumeración que no puede procesar .yellow cuando se pasa desde rawValue ?