В настоящее время я работаю над диалогом со SwiftUI и хотел бы поделиться ходом загрузки в предупреждающем сообщении. Итак, в конце обновляется процентный текст. Я использовал старую устаревшую версию Alert, а также новую, и в обеих я столкнулся с разным поведением.
Старый устаревший API
.alert(isPresented: $showingAlert) {
Alert(title: Text("Prepare download"),
message: Text("The video will be downloaded ... (\(viewModel.formattedProgressInPercent()))"),
dismissButton: .cancel(Text("Cancel")) {
viewModel.onCancelDownloadTaped()
}
)
}
Это с новым API
.alert("Prepare download",
isPresented: $showingAlert, actions: {
Button("Cancel", role: .cancel) {
viewModel.onCancelDownloadTaped()
}
}, message: {
Text("The video will be downloaded ... (\(viewModel.formattedProgressInPercent))")
}
)
Новый API не позволяет обновлять текст.
Возможно, у кого-то есть идеи, как я могу обновить текст с помощью нового API, поскольку я не хочу использовать устаревшую версию. Спасибо заранее :-)
Версия alert(_:isPresented:presenting:actions:message:)
предоставляет другой способ представления оповещения. Этот также принимает данные для представления, но в документации указано:
Данные не должны меняться после представления. Любые изменения, внесенные вами после презентации, игнорируются.
Поэтому неудивительно, что версия без данных также не поддерживает динамические обновления.
Вместо того, чтобы возвращаться к устаревшей версии, другим обходным решением было бы создать собственное оповещение. Затем вы можете отображать любую информацию, которая вам нравится, и оформлять ее так, как вам нравится.
ZStack
.Вот пример, который выглядит и ведет себя очень похоже на встроенное оповещение:
@State private var showingAlert = false
@State private var progress = 0
private var progressAlert: some View {
VStack(spacing: 0) {
VStack(spacing: 6) {
Text("Downloading...")
.font(.headline)
Text("Progress: \(progress)")
.font(.footnote)
}
.padding()
.frame(minHeight: 80)
Divider()
HStack(spacing: 0) {
Button("Cancel", role: .cancel) {
// ...
showingAlert = false
}
.fontWeight(.semibold)
.frame(maxWidth: .infinity)
Divider()
Button("Start again", role: .none) {
// ...
showingAlert = false
}
.frame(maxWidth: .infinity)
}
.buttonStyle(.borderless)
.frame(maxHeight: 44)
}
.frame(maxWidth: 270)
.background {
RoundedRectangle(cornerRadius: 10)
.fill(.background)
}
}
var body: some View {
ZStack {
// main content
if showingAlert {
Color.black
.opacity(0.2)
.ignoresSafeArea()
.onTapGesture { showingAlert = false }
.transition(.opacity.animation(.easeInOut(duration: 0.2)))
progressAlert
.transition(
.scale(0.8).combined(with: .opacity)
.animation(.spring(duration: 0.25))
)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
Используйте .alert с ошибкой в подписи. Ты можешь превратить это во что угодно