SwiftUI - кнопка-обертка в представлении, для создания пользовательской кнопки - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь создать свою собственную версию Button, оборачивая ее в представление и, таким образом, открывая возможность добавлять больше функций / скрывать модификаторы стиля. Я знаю, что это не приносит пользы, и что ButtonStyles являются мощными. Но в интересах суперчистого кода, я заинтригован тем, как его можно достичь.

В его наиболее урезанной форме я хотел бы написать что-то вроде (на основе собственной подписи Баттона):

struct MyCustomButton: View {
    let action : () -> Void
    let contents : () -> PrimitiveButtonStyleConfiguration.Label

    var body : some View {
        Button(action: self.action) {
            self.contents()
        }
    }
}

И все же, когда я пытаюсь его использовать ...

struct MyView : View {
    var body : some View {
        MyCustomButton(action: { doSomething() }) {
            Text("My custom button")
        }
    }
}

... Я получаю следующую ошибку компиляции: Невозможно преобразовать значение типа 'Текст' в закрывающий тип результата 'PrimitiveButtonStyleConfiguration .Label '

Ответы [ 2 ]

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

Поняли это:

struct NewButton<Content: View> : View {
    let content : ()-> Content
    let action: () -> Void

    init(@ViewBuilder content: @escaping () -> Content, action: @escaping () -> Void) {
        self.content = content
        self.action = action
    }

    var body: some View {
        Button(action: self.action) {
            content()
        }
    }
}
0 голосов
/ 28 апреля 2020

Вам не нужно менять Button, в соответствии с намерением SwiftUI просто необходимо предоставить пользовательский ButtonStyle, как показано в следующем примере.

struct ScaleButtonStyle: ButtonStyle {
    let bgColor: Color
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .background(bgColor)
            .scaleEffect(configuration.isPressed ? 5 : 1)
    }
}

struct DemoScaleButtonStyle: View {
    var body: some View {
        Button(action: { }) {
            Text("Button")
                .foregroundColor(.white)
        }.buttonStyle(ScaleButtonStyle(bgColor: Color.red))
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...