所以,我使用PDFKit来显示一个PDF,并保存打开最后一个已读页面。我不知道这里有什么问题。
忽略iOS版本11以下的WebView的代码。
func readBook() {
if let oldBookView = self.view.viewWithTag(3) {
oldBookView.removeFromSuperview()
// This removes the old book view when the user chooses a new book language
}
if #available(iOS 11.0, *) {
let pdfView: PDFView = PDFView()
let path = BookManager.getBookPath(bookLanguageCode: book.bookLanguageCode)
let url = URL(fileURLWithPath: path)
if let pdfDocument = PDFDocument(url: url) {
pdfView.displayMode = .singlePageContinuous
pdfView.autoScales = true
pdfView.document = pdfDocument
pdfView.tag = 3 // I assigned a tag to this view so that later on I can easily find and remove it when the user chooses a new book language
let lastReadPage = getLastReadPage()
if let page = pdfDocument.page(at: lastReadPage) {
pdfView.go(to: page)
// Subscribe to notifications so the last read page can be saved
// Must subscribe after displaying the last read page or else, the first page will be displayed instead
NotificationCenter.default.addObserver(self, selector: #selector(self.saveLastReadPage),name: .PDFViewPageChanged, object: nil)
}
}
self.containerView.addSubview(pdfView)
setConstraints(view: pdfView)
addTapGesture(view: pdfView)
} else {
let path = BookManager.getBookPath(bookLanguageCode: book.bookLanguageCode)
let url = URL(fileURLWithPath: path)
let webView: WKWebView = WKWebView()
webView.loadFileURL(url, allowingReadAccessTo: url)
webView.tag = 3 // I assigned a tag to this view so that later on I can easily find and remove it when the user chooses a new book language
self.containerView.addSubview(webView)
setConstraints(view: webView)
addTapGesture(view: webView)
}
}
private func getLastReadPage() -> Int {
let readPagesDictionary: [String:Int] = DataManager.UserDefaultsManager.value(for: .lastReadPage)
let bookLanguage = book.bookLanguageCode
let lastReadPage = readPagesDictionary[bookLanguage]
return lastReadPage!
}
@available(iOS 11.0, *)
@objc private func saveLastReadPage(notification: Notification) {
let pdfView = notification.object as! PDFView
var page = pdfView.currentDestination?.page?.pageRef?.pageNumber
let bookLanguage = book.bookLanguageCode
var readPageDict: [String:Int] = DataManager.UserDefaultsManager.value(for: .lastReadPage)
readPageDict.updateValue(page!, forKey: bookLanguage)
DataManager.UserDefaultsManager.set(readPageDict, for: .lastReadPage)
}
对我来说,我看到的是一个 "从0开始的索引 "与 "从1开始的索引 "的问题.我相信最近PDFKit做了一些改变。
我相信最近PDFKit做了一些改变,这有可能在过去是行不通的...。
使用 Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53)
Target: x86_64-apple-darwin19.5.0
和 Xcode Version 11.5 (11E608c)
这对我来说是有效的。
var currentPageNumber: Int {
let result = pdfView.currentPage?.pageRef?.pageNumber ?? 0
return result > 0 ? result - 1 : 0
}
一个可能的方法来保存当前浏览的页面的页码。
/// integer(forKey:) returns 0 when not found, which is perfect place to scroll to
/// this only addresses the case you are viewing the same document that was saved to user defaults
/// if you've gone to a new file, start at 0 there
/// you could update the document proxy to contain a last page saved if you have one,
/// and when opening the pdf, save that to user defaults
func saveCurrentPageNumber() {
UserDefaults.standard.set(currentPageNumber, forKey: pageNumberKey)
}
我把这个叫做 viewWillAppear()
/// Check user defaults and scroll to last page viewed (or 0 if none)
func scrollToSavedPage() {
let pageNumber = UserDefaults.standard.integer(forKey: pageNumberKey)
if let goToPage = document?.page(at: pageNumber) {
pdfView.go(to: goToPage)
}
}
再来一次。YMMV但这对我来说是有效的。