Представление SwiftUI для проверки подлинности - PullRequest
0 голосов
/ 11 апреля 2020

В быстром пользовательском интерфейсе я хочу, чтобы представление контента было моим root представлением для моего приложения с условной настройкой, чтобы проверить, вошли ли пользователи в систему или нет. Если пользователь вошел в список, он показывает другой способ отображения входа в систему, чтобы пользователь мог войти в систему. На основании моих исследований я не смог найти лучший способ сделать это.

В моем случае я не могу получить решение, которое я нашел, чтобы работать, и не знаю, является ли это лучшим решением.

import SwiftUI

struct ContentView: View {
    @ObservedObject var userAuth: UserAuth = UserAuth()
    // MARK: - View

    @ViewBuilder
    var body: some View {
        if !userAuth.isLoggedin {
            return LoginView().environmentObject(userAuth)
        } 
        return  BookList()
    }
}

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

import Combine

class UserAuth: ObservableObject {

    let didChange = PassthroughSubject<UserAuth,Never>()

    // required to conform to protocol 'ObservableObject'
    let willChange = PassthroughSubject<UserAuth,Never>()

    func login() {
        // login request... on success:
        self.isLoggedin = true
    }

    func logout() {
        // login request... on success:
        self.isLoggedin = false
    }

    var isLoggedin = false {
        didSet {
            didChange.send(self)
        }

//        willSet {
//            willChange.send(self)
//        }
    }
}

При запуске этого все, что я получаю, это белый экран. Кажется, что проблема может быть в построителе представлений, но при удалении я получаю непрозрачную ошибку при просмотре содержимого

Ответы [ 2 ]

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

Есть две проблемы с предоставленным моментальным снимком кода: 1) неправильный просмотр содержимого компоновщика и 2) неправильная модель.

См. Ниже оба исправлены. Протестировано с Xcode 11.4 / iOS 13.4

struct ContentView: View {
    @ObservedObject var userAuth: UserAuth = UserAuth()
    // MARK: - View

    @ViewBuilder              // no need return inside
    var body: some View {
        if !userAuth.isLoggedin {
            LoginView().environmentObject(userAuth)
        }
        else {
            BookList()
        }
    }
}

import Combine

class UserAuth: ObservableObject {
    @Published var isLoggedin = false     // published property to update view

    func login() {
        // login request... on success:
        self.isLoggedin = true
    }

    func logout() {
        // login request... on success:
        self.isLoggedin = false
    }
}
0 голосов
/ 11 апреля 2020

как насчет этого:

var body: some View {
    if !userAuth.isLoggedin {
      LoginView().environmentObject(userAuth)
    } else {
      BookList()
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...