#view #swiftui #navigation
#Вид #swiftui #навигация
Вопрос:
Я разрабатываю текстовую rpg-игру. Будет много просмотров; после каждого решения пользователь будет переходить к новому просмотру. Но если пользователь закроет приложение и снова откроет его, он потеряет весь прогресс и начнет с основного просмотра.
Есть ли способ создать кнопку «Продолжить», чтобы перевести пользователя к последнему просмотру, на котором он был? Или есть способ открыть последний просмотр непосредственно при повторном открытии приложения?
Например, пользователь начнет с этого:
struct ContentView: View {
var body: some View {
NavigationLink(destination: View1()) {
Text(Start)
}
}
}
Поиграв некоторое время, пользователь на просмотре28
struct View28: View {
var body: some View {
NavigationLink(destination: View29()) {
Text(Do This)
}
NavigationLink(destination: View30()) {
Text(Do That)
}
}
}
Пользователь закрывает игру, снова открывает ее и снова находится в contentView.
struct ContentView: View {
var body: some View {
NavigationLink(destination: View1()) {
Text(To View1)
}
NavigationLink(destination: LastViewedView()) {
Text(Continue)
}
}
}
Есть ли способ добавить кнопку «Продолжить», как указано выше, чтобы перевести пользователя в View28?
Или есть способ запрограммировать приложение на повторное открытие View28 напрямую?
Спасибо.
Комментарии:
1. Вы можете добавить ключ в UserDefaults, который сохраняется между сеансами, и когда вы открываете приложение, проверьте значение UserDefault.
2. Я использовал UserDefaults для хранения значений переменных, но я не знаю, как сохранить, в каком представлении находился пользователь.
3. Я бы сохранил значение String или Int в UserDefaults, а затем использовал это значение, чтобы определить, какое представление представить.
4. Восстановление состояния вашего приложения с помощью SwiftUI — разработчик Apple
Ответ №1:
После предложения @nicksarno я думаю, что нашел примитивный способ решения проблемы.
Я создал глобальную переменную
var ViewCounter = 0
И после каждого просмотра я добавлял этот код:
// ViewCounter will take the value of which view it is on, and UserDefaults will save the value.
.onAppear() {
ViewCounter = 28
UserDefaults.standard.set(ViewCounter, forKey: "Save1")
}
И в contentView сначала я извлекаю значение для ViewCounter:
onAppear() {
guard let retrievedmsg1 = UserDefaults.standard.value(forKey: "Save1") else {return}
ViewCounter = retrievedmsg1 as! Int
}
Затем я создал переменную состояния и создал функцию для сопоставления ее с ViewCounter:
@State var SelfViewCounter = 0
func ViewCountCheck() {
SelfViewCounter = ViewCounter
}
В разделе onAppear я вызвал функцию:
self.ViewCountCheck()
И, наконец, я создал кнопку «Пуск» и условия кнопки навигации:
// This is to start the game
NavigationLink(destination: View1()) {
Text("Start")
}
if SelfViewCounter == 1 {
NavigationLink(destination: View1()) {
Text("Continue")
}
} else if SelfViewCounter == 2 {
NavigationLink(destination: View2()) {
Text("Continue")
}
...
Я знаю, что для этого требуется много жесткого кода, и для его реализации потребуется много времени. Но это работает. Я уверен, что должен быть лучший способ, чем этот, поэтому, пожалуйста, добавьте. Спасибо.