Pdfkit go (: to) не работает в Swiftui при загрузке данных из сохраненного объекта моделиIOS

Программируем под IOS
Ответить
Anonymous
 Pdfkit go (: to) не работает в Swiftui при загрузке данных из сохраненного объекта модели

Сообщение Anonymous »

В моем приложении Swiftui у меня есть простой класс, который загружает PDF, а затем пытается перейти на страницу 2:
struct PDFKitView2: UIViewRepresentable {
let pdf: PDF

func makeUIView(context: Context) -> PDFView {
let pdfView = PDFView()
pdfView.document = PDFDocument(data: pdf.data)
pdfView.autoScales = true
pdfView.pageShadowsEnabled = false
return pdfView
}

func updateUIView(_ uiView: PDFView, context: Context) {
print("updateUIView")
if context.coordinator.shouldRestoreDestination,
let document = uiView.document,
let page = document.page(at: 2) {
DispatchQueue.main.async {
print("1")
uiView.go(to: page)
context.coordinator.shouldRestoreDestination = false
}
} else {
context.coordinator.shouldRestoreDestination = false
}
}

func makeCoordinator() -> Coordinator {
Coordinator(self)
}

class Coordinator: NSObject {
var parent: PDFKitView2
var shouldRestoreDestination: Bool

init(_ parent: PDFKitView2) {
self.parent = parent
self.shouldRestoreDestination = true
}
}
}

В моем приложении у меня есть кнопка под названием «Добавить PDF», которая вызывает .fileimporter , позволяет пользователю выбирать PDF, хранит данные в модели объекта, называемого PDF, затем запускает в нем вышеуказанное представление. Когда я делаю это так, приведенный выше код «Перейти на страницу» работает нормально. Однако, когда пользователь пытается запустить тот же сохраненный объект PDF из списка, он не поднимается на страницу 2:
образно Полный код ниже: < /p>
import SwiftUI
import SwiftData
import PDFKit

@Model
final class PDF {
var fileName: String = ""
var data: Data = Data()

init(fileName: String, data: Data) {
self.fileName = fileName
self.data = data
}
}

struct HomeView: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.modelContext) private var modelContext

@Query private var pdfs: [PDF]

@State private var pdfPopoverListIsPresented = false
@State private var pdfToPresent: PDF?
@State private var filesImporterIsPresented = false
@State private var selectedFileURL: URL?

var body: some View {
HStack {
Button("Add PDF") {
filesImporterIsPresented = true
}

Button("\(pdfs.count)") {
pdfPopoverListIsPresented = true
}
.popover(isPresented: $pdfPopoverListIsPresented) {
VStack {
ForEach(pdfs) { pdf in
Button {
pdfToPresent = pdf
} label: {
Text("\(pdf.fileName).pdf")
}
}
}
.padding()
}
}
.fileImporter(
isPresented: $filesImporterIsPresented,
allowedContentTypes: [.pdf],
allowsMultipleSelection: false
) { result in
if let urls = try? result.get(), let url = urls.first {
selectedFileURL = url
} else {
print("Error selecting file")
}
}
.fullScreenCover(item: $pdfToPresent) { pdfToPresent in
VStack {
PDFKitView2(pdf: pdfToPresent)

Button("Close") {
pdfToPresent = nil
}
}
}
.onChange(of: selectedFileURL) {
if let selectedFileURL {
if let pdf = pdf(from: selectedFileURL) {
modelContext.insert(pdf)
pdfToPresent = pdf
}
selectedFileURL = nil
}
}
.task {
do {
try modelContext.delete(model: PDF.self)
} catch {
fatalError(error.localizedDescription)
}
}
}

private func pdf(from url: URL) -> PDF? {
if url.startAccessingSecurityScopedResource() {
defer { url.stopAccessingSecurityScopedResource() }

let ext = url.pathExtension.lowercased()
if ext == Constants.fileExtensionPDF || ext == Constants.fileExtensionPlainText {
if let data = try? Data(contentsOf: url) {
return PDF(
fileName: url.deletingPathExtension().lastPathComponent,
data: data
)
}
}
}
return nil
}
}

struct PDFKitView2: UIViewRepresentable {
let pdf: PDF

func makeUIView(context: Context) -> PDFView {
let pdfView = PDFView()
pdfView.document = PDFDocument(data: pdf.data)
pdfView.autoScales = true
pdfView.pageShadowsEnabled = false
return pdfView
}

func updateUIView(_ uiView: PDFView, context: Context) {
print("updateUIView")
if context.coordinator.shouldRestoreDestination,
let document = uiView.document,
let page = document.page(at: 2) {
DispatchQueue.main.async {
print("1")
uiView.go(to: page)
context.coordinator.shouldRestoreDestination = false
}
} else {
context.coordinator.shouldRestoreDestination = false
}
}

func makeCoordinator() -> Coordinator {
Coordinator(self)
}

class Coordinator: NSObject {
var parent: PDFKitView2
var shouldRestoreDestination: Bool

init(_ parent: PDFKitView2) {
self.parent = parent
self.shouldRestoreDestination = true
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... odel-objec
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»