#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)
}
}
}
Это приводит к следующему примеру:
Комментарии:
1. Я не думаю, что вы ответили на вопрос: Изменить представление при завершении в SwiftUI . Я предлагаю вам добавить пример, как изменить
isLoggedIn
в обработчике завершения.2. Да, вы правы. Я был слишком сосредоточен на описании, что забыл название.
3. Я нашел тот же ответ в предыдущих разделах и использовал его для домашнего просмотра (вход, регистрация и код подтверждения). Но теперь я хочу полностью изменить представление ответа на вход, чтобы иметь более чистый код. Другими словами, мне не нужен домашний просмотр, который управляет 15 подвидами