Изменить вид по завершении в SwiftUI

#ios #swift #view #swiftui #completionhandler

#iOS #swift #Вид #swiftui #обработчик завершения

Вопрос:

Я разработал представление, которое управляет тремя подвидами: login , register и confirm code .

Теперь я разрабатываю отдельное представление, которое управляет всеми подвидами после успешного входа в систему. Идея заключается в том, что после успешного входа в систему новый вводится, а старый извлекается.

Я пробовал с NavigationLink в подвид входа, но, похоже, ему не нравится isActive изменение в ответе rest (т. Е. В завершении).

Вот код:

 NavigationLink(
   destination: LoggedView(),
   isActive: self.$pushToLogged,
   label: {
                
   }
).hidden()
  
 func login() {
    let lF = LoginServiceFacade()
    lF.loginMember(mobileNumber: mobileNumber, password: password, completion: {
        (response: LoginResponse?, error: ConnectionErrors?) in
            self.pushToLogged = true
    })
}
  

Ответ №1:

Это довольно простой и понятный пример возможного способа сделать это:

Сначала предоставьте представление переноса, которое проверяет, вошли ли вы в систему или нет. Отобразить соответствующий вид:

 struct ContentView: View {
    
    @State var isLoggedIn: Bool = false
    
    var body: some View {
        Group() {
            if self.isLoggedIn {
                Home(isLoggedIn: self.$isLoggedIn)
            } else {
                Login(isLoggedIn: self.$isLoggedIn)
            }
        }
    }
}

  

Затем создайте свой домашний вид, который может иметь любую структуру, которую вы хотите. Я, например, выбираю TabView:

 struct Home: View {
    
    @Binding var isLoggedIn: Bool
    
    var body: some View {
        TabView {
            Example(subTitle: "First")
                .tabItem {
                    Image(systemName: "list.dash")
                    Text("First")
                }

            Example(subTitle: "Second")
                .tabItem {
                    Image(systemName: "square.and.pencil")
                    Text("Second")
                }
        }
    }
}

struct Example: View {
    
    @State var subTitle: String
    
    var body: some View {
        Text("Hello World (self.subTitle)")
    }
}

  

Представление входа с завершением:

 struct Login: View {
    
    @Binding var isLoggedIn: Bool
    
    var myLogin: myLoginClass = myLoginClass()
    
    var body: some View {
        Button(action: {
            self.myLogin.loginWithCompletion { isSucceeded in
                if isSucceeded {
                    self.isLoggedIn.toggle()
                }
            }
        }) {
            Text("Log me in")
        }
    }
}

class myLoginClass {
    // Completing method
    // Here would be your code that would "complete" true if successfully logged in or false if error

    // I'm just waiting to "simulate" the visual process
    func loginWithCompletion(completion: @escaping (Bool) -> Void) {
        DispatchQueue.main.asyncAfter(deadline: .now()   2) {
            completion(true)
        }
    }
    
}
  

Это приводит к следующему примеру:

Пример в формате gif

Комментарии:

1. Я не думаю, что вы ответили на вопрос: Изменить представление при завершении в SwiftUI . Я предлагаю вам добавить пример, как изменить isLoggedIn в обработчике завершения.

2. Да, вы правы. Я был слишком сосредоточен на описании, что забыл название.

3. Я нашел тот же ответ в предыдущих разделах и использовал его для домашнего просмотра (вход, регистрация и код подтверждения). Но теперь я хочу полностью изменить представление ответа на вход, чтобы иметь более чистый код. Другими словами, мне не нужен домашний просмотр, который управляет 15 подвидами