SwiftUI | Как переопределить методы жизненного цикла, такие как viewWillAppear - PullRequest
0 голосов
/ 04 февраля 2020

В моем существующем приложении есть несколько настроек пользовательского интерфейса, таких как настройка пользовательской панели навигации, настройка полноэкранных фоновых изображений и некоторые другие на всех контроллерах представления. Для этого конфигурации создаются в базовом контроллере представления в viewWillAppear, все контроллеры представления и наследуются от него. Таким образом, конфигурации выполняются без каких-либо действий в дочерних контроллерах представления

Как добиться аналогичной реализации с использованием SwiftUI?

SwiftUI предоставляет onAppear() & onDisappear() методы для View, который является Struct и не используется. не поддерживает наследование. Если я создаю методы расширения или протокол, я должен вызывать методы из всех представлений.

Любая помощь приветствуется ...

1 Ответ

3 голосов
/ 04 февраля 2020

Создайте свой собственный вид контейнера. Вы можете использовать @ViewBuilder, чтобы заставить ваше представление вести себя как VStack и HStack, где требуется закрытие контента, полное подпредставлений.

Например, вот пользовательский контейнер, который дает основному контенту розовый фон и помещает панель инструментов под ним:

import SwiftUI

struct CustomContainer<Content: View>: View {
    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }

    let content: Content

    var body: some View {
        VStack(spacing: 0) {
            content
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .background(Color(hue: 0, saturation: 0.3, brightness: 1))
            Toolbar()
        }
    }
}

struct Toolbar: View {
    var body: some View {
        HStack {
            Spacer()
            button("person.3.fill")
            Spacer()
            button("printer.fill")
            Spacer()
            button("heart.fill")
            Spacer()
            button("bubble.left.fill")
            Spacer()
        } //
            .frame(height: 44)
    }

    private func button(_ name: String) -> some View {
        Image(systemName: name)
            .resizable()
            .aspectRatio(contentMode: .fit)
            .padding(4)
            .frame(width: 40, height: 40)
    }
}

И затем вот представление, которое использует это:

struct HelloView: View {
    var body: some View {
        CustomContainer {
            VStack {
                Text("hello")
                Text("khawar")
            }
        }
    }
}

import PlaygroundSupport
PlaygroundPage.current.setLiveView(HelloView())

Результат:

output showing some content inside the custom container

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