下面是我的任務管理應用程式中的一個視圖,我試圖讓我的選擇器在選擇時顯示某種顏色。我的問題是如何在核心資料中保存用于優先級和顏色選擇器的整數?我不知道如何將 int 值轉換為 int32,并且它不能作為 Int32 物件啟動,因為那樣它就不能用作每個選擇器的背景顏色的選擇器。請幫忙!
struct NewTask: View {
@Environment(\.dismiss) var dismiss
// MARK: Task Values
@State var taskTitle: String = ""
@State var taskDescription: String = ""
@State var taskDate: Date = Date()
var colors = ["Teal","Yellow","Pink"]
@State var selectedColor: Int = 0
var colorsColors = ["logoTeal","logoYellow","logoPink"]
var selectedColorInt: String {
get {
return ("\(selectedColor)")
}
}
var priorities = ["Urgent","Slightly Urgent","Not Urgent"]
@State var selectedPriority: Int = 0
var priorityColors = ["priorityRed","priorityYellow","priorityGreen"]
// MARK: Core Data Context
@Environment(\.managedObjectContext) var context
@EnvironmentObject var taskModel: TaskViewModel
var body: some View {
NavigationView{
List{
Section {
TextField("Go to work", text: $taskTitle)
Picker("Priority", selection: $selectedPriority) {
ForEach(0..<priorities.count){
Text(priorities[$0])
}
.padding(5)
.foregroundColor(.white)
.background(priorityColors[selectedPriority])
.cornerRadius(5)
}
Picker("Theme", selection: $selectedColor) {
ForEach(0..<colors.count){
Text(colors[$0])
}
.padding(5)
.foregroundColor(.black)
.background(colorColors[selectedColor])
.cornerRadius(5)
}
} header: {
Text("Task Information")
}
Section {
TextEditor(text: $taskDescription)
} header: {
Text("Task Description")
}
// Disabling Date for Edit Mode
if taskModel.editTask == nil{
Section {
DatePicker("", selection: $taskDate)
.datePickerStyle(.graphical)
.labelsHidden()
} header: {
Text("Task Date")
}
}
}
.listStyle(.insetGrouped)
.navigationTitle("Add New Task")
.navigationBarTitleDisplayMode(.inline)
// MARK: Disbaling Dismiss on Swipe
.interactiveDismissDisabled()
// MARK: Action Buttons
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Save"){
if let task = taskModel.editTask{
task.taskTitle = taskTitle
task.taskDescription = taskDescription
}
else{
let task = Task(context: context)
task.taskTitle = taskTitle
task.taskDescription = taskDescription
task.taskDate = taskDate
/*task.selectedColor = selectedColor*/
/*task.selectedPriority = selectedPriority*/
}
// Saving
try? context.save()
// Dismissing View
dismiss()
}
.disabled(taskTitle == "" || taskDescription == "")
}
ToolbarItem(placement: .navigationBarLeading) {
Button("Cancel"){
dismiss()
}
}
}
// Loading Task data if from Edit
.onAppear {
if let task = taskModel.editTask{
taskTitle = task.taskTitle ?? ""
taskDescription = task.taskDescription ?? ""
}
}
}
}
}
uj5u.com熱心網友回復:
這是我將采取的方法。
首先,由于優先級只能是三個值之一,因此將其表示為具有 Int32 原始值的列舉,并將文本描述和顏色作為列舉的屬性:
enum Priority: Int32, CaseIterable {
case urgent = 0
case slightlyUrgent = 1
case notUrgent = 2
var description: String {
switch self {
case .urgent: return "Urgent"
case .slightlyUrgent: return "Slightly Urgent"
case .notUrgent: return "Not Urgent"
}
}
var colorName: String {
switch self {
case .urgent: return "PriorityRed"
case .slightlyUrgent: return "PriorityYellow"
case .notUrgent: return "PriorityGreen"
}
}
var color: Color { Color(colorName) }
}
在表單中,這使您的代碼更簡潔,并允許您0在初始化狀態變數時使用語意值:
@State private var selectedPriority: Priority = .urgent
Picker("Priority", selection: $selectedPriority) {
ForEach(Priority.allCases, id: \.self) { priority in
Text(priority.description)
.padding(5)
.foregroundColor(.black)
.background(priority.color)
.cornerRadius(5)
}
}
然后,向 CoreData 模型添加一個擴展,為其提供一個Priority屬性,添加一個 getter 和 setter 以便它使用存盤的列:
extension Task {
var priorityEnum: Priority {
get { Priority(rawValue: priority) ?? .urgent }
set { priority = newValue.rawValue }
}
}
然后在將表單詳細資訊保存到 Core Data 托管物件中時,您可以設定task.priorityEnum選擇器的值,自定義屬性將確保Int32存盤正確的值。
同樣,當從任務加載編輯表單的狀態變數時,參考task.priorityEnum將為您獲取一個Priority使用存盤在資料庫中的整數初始化的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/466284.html
