SWIFTUI — Как перейти к последнему просмотру после повторного открытия приложения?

#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")
        }
        ...
 

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