SwiftUI: изменение цвета фона TectField при нажатии - PullRequest
1 голос
/ 22 апреля 2020

Я новичок в SwiftUI и в режиме обучения.

Я работаю над кодом, который позволит пользователю выбирать дату из календаря. Каждый день в календаре представлен текстовым полем. Мне бы хотелось, чтобы цвет фона выбранного дня изменялся при нажатии. Я могу изменить фон при первой загрузке представления, но я не смог найти способ изменить его при касании. Спасибо за помощь.

import SwiftUI

var selectDay: Int = 0

struct ContentView: View {

    @State var strDays = ["01","02","03","04","05","06","07"]

    var body: some View {

        VStack (spacing:10) {

            HStack (spacing: 2) {

                TextField("", text: $strDays[0])
                    .modifier(dayModifier())
                    .background(getBackgroundColor(thisDay: 0))
                    .onTapGesture {
                        self.selectDate(selection: 0)
                 }

                TextField("", text: $strDays[1])
                    .modifier(dayModifier())
                    .background(getBackgroundColor(thisDay: 1))
                    .onTapGesture {
                        self.selectDate(selection: 1)

                }

            }

        }

    }

    func selectDate(selection: Int) {
        strDays[selection] = "99"
        selectDay = selection
    }

    func getBackgroundColor(thisDay: Int) -> Color {

        var backgroundColor = Color.clear

        if selectDay == thisDay {
            backgroundColor = Color.blue
        }

    return backgroundColor

    }

struct dayModifier: ViewModifier {

     func body(content: Content) -> some View {

        return content
            .frame(width: 50.0, height: 50)
            .multilineTextAlignment(.center)
            .foregroundColor(.primary)
            .border(Color.primary, width: /*@START_MENU_TOKEN@*/1/*@END_MENU_TOKEN@*/)

            .disabled(true)

    }

}

1 Ответ

0 голосов
/ 22 апреля 2020

По логике c кода вам нужно Text вместо TextField, поэтому найдите ниже исправленный и работающий снимок.

Протестировано с Xcode 11.4 / iOS 13.4

demo

struct ContentView: View {

    @State var selectDay: Int = 0
    @State var strDays = ["01","02","03","04","05","06","07"]

    var body: some View {
        VStack (spacing:10) {
            HStack (spacing: 2) {
                Text(strDays[0])
                    .modifier(dayModifier())
                    .background(getBackgroundColor(thisDay: 0))
                    .onTapGesture {
                        self.selectDate(selection: 0)
                }

                Text(strDays[1])
                    .modifier(dayModifier())
                    .background(getBackgroundColor(thisDay: 1))
                    .onTapGesture {
                        self.selectDate(selection: 1)

                }
            }
        }
    }

    func selectDate(selection: Int) {
        strDays[selection] = "99"
        selectDay = selection
    }

    func getBackgroundColor(thisDay: Int) -> Color {
        var backgroundColor = Color.clear
        if selectDay == thisDay {
            backgroundColor = Color.blue
        }
        return backgroundColor

    }

    struct dayModifier: ViewModifier {
        func body(content: Content) -> some View {
            content
                .frame(width: 50.0, height: 50)
                .multilineTextAlignment(.center)
                .foregroundColor(.primary)
                .border(Color.primary, width: 1)
        }
    }
}
...