如何在 Swift 中使用 PDFkit 搜索 PDF

mrw*_*pro 3 swift ios-pdfkit

我的目标是搜索一个字符串,然后转到它。我有实现它所需的这三行代码。我只知道我实现这一目标的思维过程遗漏了一些东西。我不知道如何使用.findstring。我读到它返回一个 PDFSelections 数组。但我不确定如何使用.setCurrentSelectionPDFSelection 数组来使用它。

let found = document.findString(selection, withOptions: .caseInsensitive)
let stringSelection = page?.selection(for: NSRange(location:10, length:5))
pdfView.setCurrentSelection(stringSelection, animate: true)
Run Code Online (Sandbox Code Playgroud)

小智 6

创建 SearchTableViewController ViewController :

\n\n
import UIKit\nimport PDFKit\n\nprotocol SearchTableViewControllerDelegate: class {\n    func searchTableViewController(_ searchTableViewController: SearchTableViewController, didSelectSerchResult selection: PDFSelection)\n}\n\nclass SearchTableViewController: UITableViewController {\n\n    open var pdfDocument: PDFDocument?\n    weak var delegate: SearchTableViewControllerDelegate?\n\n    var searchBar = UISearchBar()\n    var searchResults = [PDFSelection]()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        tableView.rowHeight = 150\n\n        searchBar.delegate = self\n        searchBar.showsCancelButton = true\n        searchBar.searchBarStyle = .minimal\n        navigationItem.titleView = searchBar\n\n        navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel,\n                                                           target: self,\n                                                           action: #selector(closeBtnClick))\n\n        tableView.register(UINib(nibName: "SearchViewCell", bundle: nil), forCellReuseIdentifier: "SearchViewCell")\n\n    }\n\n    @objc func closeBtnClick(sender: UIBarButtonItem) {\n        dismiss(animated: false, completion: nil)\n    }\n\n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        searchBar.becomeFirstResponder()\n    }\n\n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n        // Dispose of any resources that can be recreated.\n    }\n\n    // MARK: - Table view data source\n    override func numberOfSections(in tableView: UITableView) -> Int {\n        // #warning Incomplete implementation, return the number of sections\n        return 1\n    }\n\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        // #warning Incomplete implementation, return the number of rows\n        return searchResults.count\n    }\n\n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: "SearchViewCell", for: indexPath) as! SearchViewCell\n\n        let selection = searchResults[indexPath.row]\n        let page = selection.pages[0]\n        let outline = pdfDocument?.outlineItem(for: selection)\n\n        let outlintstr = outline?.label ?? ""\n        let pagestr = page.label ?? ""\n        let txt = outlintstr + " \xe9\xa1\xb5\xe7\xa0\x81:  " + pagestr\n        cell.destinationLabel.text = ""\n\n        let extendSelection = selection.copy() as! PDFSelection\n        extendSelection.extend(atStart: 10)\n        extendSelection.extend(atEnd: 90)\n        extendSelection.extendForLineBoundaries()\n\n        let range = (extendSelection.string! as NSString).range(of: selection.string!, options: .caseInsensitive)\n        let attrstr = NSMutableAttributedString(string: extendSelection.string!)\n        attrstr.addAttribute(NSAttributedStringKey.backgroundColor, value: UIColor.yellow, range: range)\n\n        cell.resultTextLabel.attributedText = attrstr\n\n        return cell\n    }\n\n    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n\n        let selection = searchResults[indexPath.row]\n        delegate?.searchTableViewController(self, didSelectSerchResult: selection)\n        dismiss(animated: false, completion: nil)\n    }\n\n    override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {\n        searchBar.resignFirstResponder()\n    }\n}\n\nextension SearchTableViewController: UISearchBarDelegate {\n    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {\n        searchBar.resignFirstResponder()\n    }\n\n    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {\n        pdfDocument?.cancelFindString()\n        dismiss(animated: false, completion: nil)\n    }\n\n    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {\n//        if searchText.count < 2 {\n//            return\n//        }\n\n        searchResults.removeAll()\n        tableView.reloadData()\n        pdfDocument?.cancelFindString()\n        pdfDocument?.delegate = self\n        pdfDocument?.beginFindString(searchText, withOptions: .caseInsensitive)\n    }\n}\n\nextension SearchTableViewController: PDFDocumentDelegate {\n    func didMatchString(_ instance: PDFSelection) {\n        searchResults.append(instance)\n        tableView.reloadData()\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在搜索按钮上点击:

\n\n
let searchViewController = SearchTableViewController()\n        searchViewController.pdfDocument = self.pdfdocument\n        searchViewController.delegate = self\n\n        let nav = UINavigationController(rootViewController: searchViewController)\n        self.present(nav, animated: false, completion:nil)\n
Run Code Online (Sandbox Code Playgroud)\n\n

您将在以下位置获得突出显示的文本:

\n\n
func searchTableViewController(_ searchTableViewController: SearchTableViewController, didSelectSerchResult selection: PDFSelection) {\n        selection.color = UIColor.yellow\n        self.pdfview.currentSelection = selection\n        self.pdfview.go(to: selection)\n        calculateStandByMood()\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

只需在 pdfViewController 中添加此协议:

\n\n
SearchTableViewControllerDelegate\n
Run Code Online (Sandbox Code Playgroud)\n