Как я смогу выполнить код (например, нажав представление) через определенное время |SwiftUI - PullRequest
0 голосов
/ 06 октября 2019

Что я имею в виду; Как бы я мог выдвинуть представление (то есть перейти на другой экран) после (например) 20-секундного таймера? Я занимаюсь разработкой приложения через SwiftUI, но я знаю только так много. Я был бы очень благодарен, если бы кто-то мог помочь мне пройти через это. Вот мой код для страницы до того, как представление выдвигается.

struct SwiftUIView : View {
var body: some View {
    NavigationView() {
        VStack{
            Text("Thank you for your time.")
                .font(.headline)
                .multilineTextAlignment(.center)
                .lineLimit(5)
                .padding(.horizontal, 50.0)
            Text("We'll be in touch shortly.")
                .font(.subheadline)
                .multilineTextAlignment(.center)
                .lineLimit(5)
                .padding(.horizontal, 50.0)
                .padding(.bottom, 450.0)
        }
    }.navigationBarBackButtonHidden(true)
    }
}

Вот изображение холста.

(Мой вопрос теперь помечен какдубликат чужого. Я могу объяснить, почему это не так. Вопрос, который я «дублирую», - это не кто иной, как кто-то, спрашивающий: «Как я могу изменить текст через определенное время», в то время как мой вопрос таков:Как выдвинуть представление через определенное время. "Очень близко, но не дубликат.)

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

В SwiftUI вы должны использовать NavigationView и NavigationLink для навигации. Вы также можете использовать NavigationView и NavigationLink для программной навигации с этим API, принадлежащим структуре NavigationLink:

/// Creates an instance that presents `destination` when active.
public init(destination: Destination, isActive: Binding<Bool>, @ViewBuilder label: () -> Label)

Итак, вы можете сделать что-то подобное (точный код может зависеть от того, чтовам действительно нужно получить):

class ContentViewModel: ObservableObject {
    @Published var navigate = false

    init() {
        DispatchQueue.main.asyncAfter(deadline: .now()+2) { //navigate after 2 secs
            self.navigate = true
        }
    }        
}

struct ContentView: View {
    @ObservedObject var contentViewModel = ContentViewModel()

    var body: some View {
        NavigationView {
            ZStack {
                Text("Hello World!")
                NavigationLink(destination: DetailView(), isActive: $contentViewModel.navigate) {
                    EmptyView() //you don't need a view if you want to navigate programmatically
                }
            }
        }            
    }
}

struct DetailView: View {
    var body: some View {
        Text("Navigation complete!")
    }
}

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

К сожалению, в SwiftUI есть ошибка: если вы запустите приведенный выше код, вы увидите, что нажатие кнопки «Назад» в подробном представлении заставляет представление содержимого перемещаться сновав подробный вид. Только однажды. Если вы снова нажмете кнопку «Назад», ошибка больше не будет возникать. Это известная проблема (мы все ждем, пока Apple исправит это). Вы можете переопределить кнопку возврата по умолчанию, чтобы решить эту проблему. Это обходной путь, но сейчас мы не можем добиться большего успеха:

class ContentViewModel: ObservableObject {
    @Published var navigate = false

    init() {
        DispatchQueue.main.asyncAfter(deadline: .now()+2) {
            self.navigate = true
        }
    }
}

struct ContentView: View {
    @ObservedObject var contentViewModel = ContentViewModel()

    var body: some View {
        NavigationView {
            ZStack {
                Text("Hello World!")
                NavigationLink(destination: DetailView(contentViewModel: contentViewModel), isActive: $contentViewModel.navigate) {
                    EmptyView()
                }
            }
        }
    }
}

struct DetailView: View {
    @ObservedObject var contentViewModel: ContentViewModel

    var body: some View {
        Text("Navigation complete!")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: Text("Back").onTapGesture { //this is just an example, it's a plain text
                self.contentViewModel.navigate = false
            })
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
0 голосов
/ 06 октября 2019

У вас есть два варианта:

, вы можете использовать

sleep(20)
// code

, чтобы остановить выполнение всего кода, или

DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
    // code
}

, чтобы выполнить ТОЛЬКО код внутризакрытие через 20 секунд.

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

struct SwiftUIView : View {

    @State var isNewViewShowed: Bool = false

    var body: some View {
        VStack {
            Button(action: {
                DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
                    isNewViewShowed.toggle()
                }
            }) {
                Text("Present New View")
            }
        }.sheet(isPresented: $isNewViewShowed) {
            NewView()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...