我的目标是搜索一个字符串,然后转到它。我有实现它所需的这三行代码。我只知道我实现这一目标的思维过程遗漏了一些东西。我不知道如何使用.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\nimport 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}\nRun Code Online (Sandbox Code Playgroud)\n\n在搜索按钮上点击:
\n\nlet 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)\nRun Code Online (Sandbox Code Playgroud)\n\n您将在以下位置获得突出显示的文本:
\n\nfunc 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 }\nRun Code Online (Sandbox Code Playgroud)\n\n只需在 pdfViewController 中添加此协议:
\n\nSearchTableViewControllerDelegate\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5866 次 |
| 最近记录: |