В моем приложении 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
Pdfkit go (: to) не работает в Swiftui при загрузке данных из сохраненного объекта модели ⇐ IOS
Программируем под IOS
1756600875
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:
[youtube]oxdvao7qsrm[/youtube]образно Полный код ниже: < /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
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79751508/pdfkit-goto-not-working-in-swiftui-when-loading-data-from-a-saved-model-objec[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия