Как вы вызываете функцию ContentView из объекта View? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть демонстрационная версия, чтобы проиллюстрировать мой вопрос, вы можете проверить это ниже. Я хочу, чтобы этот SwipeBar изменял цвет фона основного ContentView, но я не знаю, как это сделать. Ранее я использовал ObservableObject для выполнения sh чего-то похожего, но View не может иметь тип ObservableObject, поэтому я не уверен, как этот SwipeBar «общается» с ContentView, который его создал. Любые способы сделать это?

Быстрый просмотр того, что делает этот код: https://imgur.com/gallery/JhomUmu

Весь ContentView.swift:

import SwiftUI

struct ContentView: View {

    @State var backGroundColor: Color = .purple

    var body: some View {
        VStack {
            Spacer()

            SwipeBar()

            Spacer()
        }.background(backGroundColor)
    }

    func changeBackgroundColor(color: Color) {
        self.backGroundColor = color
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Весь SwipeBar.swift:

import SwiftUI

struct SwipeBar: View {

    @State var draggedOffset = CGSize.zero
    @State var greenOpacityLevel: Double = 0.3
    @State var redOpacityLevel: Double = 0.3

    var body: some View {
        ZStack {
            ZStack {
                HStack {
                    ZStack {
                        RoundedRectangle(cornerRadius: 30, style: .continuous)
                            .fill(Color.green)
                            .frame(width: 100, height: 70)
                        Text("GREEN")
                            .padding(10)
                            .foregroundColor(.white)
                            .font(.system(size: 25))
                    }.padding(.leading, 20)
                     .opacity(self.greenOpacityLevel)

                    Spacer()

                    ZStack {
                        RoundedRectangle(cornerRadius: 30, style: .continuous)
                            .fill(Color.red)
                            .frame(width: 100, height: 70)
                        Text("RED")
                            .padding(10)
                            .foregroundColor(.white)
                            .font(.system(size: 25))
                    }.padding(.trailing, 20)
                     .opacity(self.redOpacityLevel)
                }

                ZStack {
                    RoundedRectangle(cornerRadius: 30, style: .continuous)
                        .fill(Color.blue)
                        .frame(width: 375, height: 70)
                    Text("SWIPE LEFT OR RIGHT")
                        .foregroundColor(.white)
                        .font(.system(size: 20))
                }
                .offset(x: self.draggedOffset.width)
                .gesture(DragGesture(minimumDistance: 20, coordinateSpace: .local)
                .onChanged { value in
                    self.draggedOffset = value.translation

                    if self.draggedOffset.width >= 120 {
                        self.greenOpacityLevel = 1.0
                        self.draggedOffset.width = 120
                    } else {
                        self.greenOpacityLevel = 0.4
                    }

                    if self.draggedOffset.width <= -120 {
                        self.redOpacityLevel = 1.0
                        self.draggedOffset.width = -120
                    } else {
                        self.redOpacityLevel = 0.4
                    }
                }
                .onEnded { value in
                    if self.draggedOffset.width <= -120 {
                        // Call the ContentView's changeBackGround function and pass in Color.red
                        print("background should change to red")
                    }
                    if self.draggedOffset.width >= 120 {
                        // Call the ContentView's changeBackGround function and pass in Color.green
                        print("background should change to green")
                    }
                    self.draggedOffset = CGSize.zero
                    self.redOpacityLevel = 0.4
                    self.greenOpacityLevel = 0.4
                    }
                )
            }
        }
    }
}

Настоящий вопрос заключается в последней части кода. Как вызвать функцию ContentView для изменения цвета фона?

if self.draggedOffset.width <= -120 {
    // Call the ContentView's changeBackGround function and pass in Color.red
    print("background should change to red")
}
if self.draggedOffset.width >= 120 {
    // Call the ContentView's changeBackGround function and pass in Color.green
    print("background should change to green")
}

1 Ответ

0 голосов
/ 24 февраля 2020

Измените SwipeBar на Color на *1003*:

struct SwipeBar: View {
    @Binding var color: Color
    ...

, а затем обновите значение color, где это необходимо, в SwipeBar:

.onEnded { value in
    if self.draggedOffset.width <= -120 { self.color = .red }
    else if self.draggedOffset.width >= 120 { self.color = .green }
    ...
}

В ContentView создайте Binding для свойства backGroundColor и передайте его SwipeBar:

SwipeBar(color: self.$backGroundColor)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...