【问题标题】:How to only display part of web page content (swift)如何只显示部分网页内容(swift)
【发布时间】:2015-06-01 19:45:04
【问题描述】:

我是编码新手(完全没有任何编程语言背景)。我正在努力学习快速。我想创建一个简单的天气应用程序,一旦用户进入一个城市,它就会以文本形式显示天气信息。我正在从 weather-forecast.com 获取内容。我已经弄清楚如何加载网页内容,但我只想显示页面内容的一个 sn-p(一段),而不是整个页面。有人可以告诉我怎么做吗?

{
import UIKit

class ViewController: UIViewController, UIWebViewDelegate {

    @IBOutlet weak var cityText: UITextField!

    @IBOutlet weak var webContent: UIWebView!

    @IBAction func GoButtonPressed(sender: AnyObject) {

        let url = NSURL (string: "http://www.weather-forecast.com");
        let requestObj = NSURLRequest(URL: url!); 
        webContent.loadRequest(requestObj);
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }    
}
}

【问题讨论】:

    标签: ios swift uiwebview nsurlrequest


    【解决方案1】:

    这是一个简单的视图控制器示例,它仅加载网站 dribble.com 的一部分。控制器具有选择 DOM 元素并仅显示该元素的方法。它非常简单,但功能强大,足以展示您如何在此方面进一步工作。

    import UIKit
    import JavaScriptCore
    import WebKit
    
    class TestViewController: UIViewController {
    
        private weak var webView: WKWebView!
    
        private var userContentController: WKUserContentController!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            createViews()
    
            loadPage("https://dribbble.com/", partialContentQuerySelector: ".dribbbles.group")
        }
    
        private func createViews() {
             userContentController = WKUserContentController()
    
            let configuration = WKWebViewConfiguration()
            configuration.userContentController = userContentController
    
            let webView = WKWebView(frame: view.bounds, configuration: configuration)
            webView.setTranslatesAutoresizingMaskIntoConstraints(false)
            view.addSubview(webView)
    
            let views: [String: AnyObject] = ["webView": webView, "topLayoutGuide": topLayoutGuide]
            view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[topLayoutGuide][webView]|", options: .allZeros, metrics: nil, views: views))
            view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[topLayoutGuide][webView]|", options: .allZeros, metrics: nil, views: views))
    
    
            self.webView = webView
        }
    
        private func loadPage(urlString: String, partialContentQuerySelector selector: String) {
            userContentController.removeAllUserScripts()
            let userScript = WKUserScript(source: scriptWithDOMSelector(selector),
            injectionTime: WKUserScriptInjectionTime.AtDocumentEnd,
                forMainFrameOnly: true)
    
            userContentController.addUserScript(userScript)
    
            let url = NSURL(string: urlString)!
            webView.loadRequest(NSURLRequest(URL: url))
        }
    
        private func scriptWithDOMSelector(selector: String) -> String {
            let script =
            "var selectedElement = document.querySelector('\(selector)');" +
            "document.body.innerHTML = selectedElement.innerHTML;"
            return script
        }
    
    }
    

    上例中的视图控制器只加载照片,设计部分在 dribble 网站内。

    【讨论】:

      【解决方案2】:

      您将无法轻松做到这一点 - UIWebView 没有任何 API 来公开它正在加载的网页的结构,也没有控制/允许页面的部分加载。

      也许您可以抓取页面内容然后显示它,但您会在将其加载到 UIWebView 之前执行此操作,并且在您抓取它之后,Web 视图可能不是最好的方式无论如何都显示它。

      搜索 html 和网络抓取以了解该术语的含义。

      或者,如果您知道网页内容结构,则可以在 UIWebView 加载页面时将 javascript 注入页面,并且 javascript 会阻止页面的其他部分显示(但如果 weather-forecast.com 更改结构他们的 html 将来你的 javascript 可能不再工作了)

      不管怎样,对于初学者来说,这两种方法似乎都太复杂了,除非你能快速上手并且有能力,但要学习的东西很多。

      【讨论】:

        【解决方案3】:

        您可以将天气 API 安装到您的应用中,而不是从网站上获取数据。这会更快,也可能更容易,因为大多数天气 API 都可以选择要显示的信息。

        有关如何安装天气 API 的更多信息,请访问this 网站。

        托比,希望我解决了你的问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多