2022-04-15

SwiftUI : How I can pass model's title to state string variable?

//
//  CreateReminderView.swift
//  SwiftUICaneldarProject
//
//  Created by Chuljin Hwang on 2022/03/15.
//

import SwiftUI
struct CreateReminderView: View {
  @Environment(\.presentationMode) var presentationMode
    
  @EnvironmentObject var vm : CalendarViewModel
    
  @StateObject var remindervm = ReminderViewModel()
    
  @State private var textalert : String = ""
  @State private var taskTitle : String = ""
    @State private var isEditMode : Bool = false

  let selectedTask : TaskModel?
    
    init(task : TaskModel?) {
        self.selectedTask = task
        
        if let editTask = selectedTask {
            self.taskTitle = editTask.title
            print(taskTitle)
            print(editTask.title)
        }
    }
  
  var body: some View {
    VStack(spacing:20){
      Group{
        inputTextTitleSection
          .padding(.top,60)
        inputTextSection
        inputTextEditor
        
        Divider()
          .background(Color.caltheme.lightgray)
        
        inputDateSection
        
      }
      
      TextTitle(textTitle: "Select Color")
      circleColorSection
      Spacer()
      createButtonSection
        .padding(.bottom, 20)
    }
    .alert(isPresented: $remindervm.isshowAlert, content: remindervm.getAlert)
  }
  func isPressedCreateReminer() {
//    if remindervm.textCondition(){
        vm.addTask(title: taskTitle,content: remindervm.textEditorTodo, selectedColor: remindervm.selectedColor, reminderTime: Int(remindervm.minutes), taskDate: remindervm.taskDate)
      presentationMode.wrappedValue.dismiss()
//    }
  }
}

//struct CreateReminderView_Previews: PreviewProvider {
//  static var previews: some View {
//    CreateReminderView()
//      .preferredColorScheme(.dark)
//      .environmentObject(CalendarViewModel())
//  }
//}

extension CreateReminderView {
  private var inputTextTitleSection : some View{
    Text("Create a new remainder")
      .font(.title)
      .bold()
      .foregroundColor(Color.caltheme.secondaryText)
      .frame(maxWidth:.infinity, alignment: .leading)
      .padding(.horizontal)
  }
  
    
  @ViewBuilder
  private var inputTextSection : some View {
    HStack{
        TextField("Input your task...", text: $taskTitle)
          .foregroundColor(
            remindervm.createReminderText.isEmpty ?
            Color.caltheme.secondaryText : remindervm.selectedColor)
          .disableAutocorrection(true)
          .overlay(
            Image(systemName: "xmark.circle.fill")
              .padding()
              .offset(x: 10)
              .foregroundColor(remindervm.selectedColor)
              .opacity(remindervm.createReminderText.isEmpty ? 0.0 : 1.0)
              .onTapGesture {
                UIApplication.shared.closeKeyboard()
                remindervm.createReminderText = ""
              }
            ,alignment:  .trailing
          )
    }
    .font(.title3)
    .background(
      RoundedRectangle(cornerRadius: 15)
        .fill(Color.caltheme.background)
        .shadow(color: Color.caltheme.black.opacity(0.5), radius: 10, x: 0, y: 0)
    )
    .padding(.horizontal)
    Divider()
      .background(Color.caltheme.lightgray)
  }
    
  @ViewBuilder
  private var inputTextEditor: some View{
    VStack {
      TextEditor(text: $remindervm.textEditorTodo)
      
        .foregroundColor(remindervm.textEditorTodo.isEmpty ? Color.caltheme.secondaryText : remindervm.selectedColor)
        .frame(width: UIScreen.main.bounds.width * 0.9)
        .frame(height:200)
        .colorMultiply(Color.white.opacity(0.5))
        .padding(.leading)
        .padding(.trailing)
        .lineSpacing(8)
        .cornerRadius(15)
    }
    
  }
  
  @ViewBuilder
  private var inputDateSection: some View{
    DatePicker("Task Date", selection: $remindervm.taskDate)
    //    DatePicker("Task Date", selection: $remindervm.taskDate, displayedComponents: .date)
    //      .font(.title3)
    //      .padding(.horizontal)
    Divider()
      .background(Color.caltheme.lightgray)
  }
  
  private var circleColorSection: some View{
    HStack(spacing:5){
      ForEach(remindervm.circle, id:\.self){color in
        Circle()
          .frame(width: 40, height: 40)
          .foregroundColor(color)
          .background(
            Circle()
              .frame(width: 45, height: 45)
              .foregroundColor(color == remindervm.selectedColor ? Color.white : Color.clear)
              .shadow(color: color == remindervm.selectedColor ? Color.white : Color.clear, radius: 5, x: 0, y: 0))
          .onTapGesture {
            withAnimation(.easeIn){
              remindervm.selectedColor = color
            }
          }
      }
      .frame(maxWidth:.infinity)
      .padding(.horizontal)
    }
  }
  private var timeTextSection: some View{
    HStack(spacing : 0) {
      Text(remindervm.toProgress.roundCGFloat())
        .frame(width:50)
      Text("Minutes")
        .frame(width:130)
    }
    .font(.largeTitle.bold())
    .foregroundColor(Color.caltheme.secondaryText)
    .padding(.horizontal)
    .scaleEffect(1.5)
  }
  private var createButtonSection: some View{
    Button(action: {
      isPressedCreateReminer()
    }, label: {
      Text("Create Reminder")
    })
    .font(.title)
    .foregroundColor(Color.caltheme.secondaryText)
    .frame(maxWidth: .infinity)
    .frame(height:50)
    .background(remindervm.selectedColor)
    .cornerRadius(10)
    .padding(.horizontal)
  }
}

Hi! I'm wondering how I can pass model's title to @State var textTitle. enter image description here

As you can see from my picture, The model is passed well as optional type, and I did binding but the model's title is not passed to @State text. This is about Editing task's title.

The weird thing is

task works, but textTitle is "" by init(), I passed it to that but that is not works.

How I can handle this?



No comments:

Post a Comment