Невозможно использовать поведение переключения для запуска .buttonStyle в SWIFTUI - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть две кнопки Style, mainButtonOn и mainButtonOff. Я хочу, чтобы моя кнопка использовала одну или другую в зависимости от состояния переключения. В следующем коде выдается ошибка «Невозможно определить сложный тип возврата замыкания; добавьте явно тип для устранения неоднозначности».

Я новичок в SwiftUI, так что, если вы видите проблему, я буду рад, если вы тупой твой ответ далеко вниз. Спасибо всем.

import SwiftUI
struct ContentView: View {
    var displayTime = "Ahoy"

    func getTime(oldTime: Int, addedTime: Int) -> Int {
        return oldTime + addedTime
    }

       @State var hoursOn:Bool = true

    struct mainButtonOff: ButtonStyle {

        func makeBody(configuration: Self.Configuration) -> some View {
            configuration.label
                .frame(width: 110, height: 35, alignment: .center)
                .background(Color.white)
                .foregroundColor(Color.gray)
                .cornerRadius(30)
                .overlay(RoundedRectangle(cornerRadius: 30) .stroke(Color.gray, lineWidth: 1))
        }
    }

    struct mainButtonOn: ButtonStyle {

        func makeBody(configuration: Self.Configuration) -> some View {
            configuration.label
                .frame(width: 110, height: 35, alignment: .center)
                .background(Color.blue)
                .foregroundColor(Color.white)
                .cornerRadius(30)
                .overlay(RoundedRectangle(cornerRadius: 30) .stroke(Color.blue, lineWidth: 1))
        }
    }


    var body: some View {

        let displayTime = String(getTime(oldTime: 15, addedTime: 10)) // get time and turn it into a string

        return VStack { // ***** ERROR: Unable to infer complex closure return type; add explicitly type to disambiguate.
            //Spacer()
            Text(displayTime)
            //Spacer()
            Button(action: {self.hoursOn.toggle()}) {
                Text("Hours")
                    .font(.headline)
            }
                .buttonStyle(self.hoursOn ? mainButtonOn() : mainButtonOff())
                //.buttonStyle(mainButtonOff()) // <= USING THIS LINE INSTEAD THROWS NO ERROR
        }
    }
}

1 Ответ

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

Один из подходов состоит в том, чтобы обойти проблему:

            if self.hoursOn {
            Button(action: {self.hoursOn.toggle()}) {
                Text("Hours").font(.headline)
            }.buttonStyle(mainButtonOn())
        } else {
            Button(action: {self.hoursOn.toggle()}) {
                Text("Hours").font(.headline)
            }.buttonStyle(mainButtonOff())
        }

Другой более краткий подход заключается в следующем:

struct mainButtonOnOff: ButtonStyle {
    let onoff: Bool

    init(_ switsh: Bool) {
        self.onoff = switsh
    }

    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .frame(width: 110, height: 35, alignment: .center)
            .background(self.onoff ? Color.blue : Color.white)
            .foregroundColor(self.onoff ? Color.white : Color.gray)
            .cornerRadius(30)
            .overlay(RoundedRectangle(cornerRadius: 30) .stroke(self.onoff ? Color.blue : Color.gray, lineWidth: 1))
    }
}

and:

    Button(action: {self.hoursOn.toggle()}) {
            Text("Hours") .font(.headline)
        }.buttonStyle(mainButtonOnOff(self.hoursOn))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...