繁体   English   中英

当两者都以编程方式实现时,使用UIButton重新加载UIWebView(Swift)

[英]Reload UIWebView with UIButton when both are implemented programmatically (Swift)

我有一个UIWebView,它加载了嵌入的SoundCloud轨道。 我从网站复制了代码,创建了一个html文件,并将其包含在Xcode项目中。 它加载得很好。 但是,我希望用户能够重新加载WebView,因为UIWebView非常小并且没有任何导航按钮。 它只是显示SoundCloud嵌入小部件。

有没有一种方法可以在使用Interface Builder的 情况下实现? 轻按按钮会导致应用崩溃。

我已经以编程 方式在屏幕上实现了UIWebViewUIButton ,因为根据iPhone屏幕的大小,每个控件的大小和坐标都会有所不同。

UIWebView 在viewDidLoad函数之前设置为nil因此可以在其他函数(如reload函数)中对其进行访问。

class SecondViewController: UIViewController, UIWebViewDelegate {

    let WebView: UIWebView! = nil
    override  func viewDidLoad() {
        super.viewDidLoad()

        let WebViewDetails = getCoordAndSize("WEBV") // stores 4 values into one variable. its a tuple
        let WebView = UIWebView(frame: CGRectMake(WebViewDetails.0, WebViewDetails.1, WebViewDetails.2, WebViewDetails.3))

        //load local html file
        let localfilePath = NSBundle.mainBundle().URLForResource("sctrack", withExtension: "html")
        let myRequest = NSURLRequest(URL: localfilePath!)
        WebView.loadRequest(myRequest)
        WebView.delegate = self

        let refreshButton = UIButton()
        refreshButton.setTitle("Refresh", forState: .Normal)
        refreshButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        refreshButton.backgroundColor = UIColor.clearColor()
        refreshButton.layer.cornerRadius = 5
        refreshButton.layer.borderWidth = 1
        refreshButton.layer.borderColor = UIColor.whiteColor().CGColor
        refreshButton.frame = CGRectMake((self.view.frame.size.width - 240) / 2, (imageViewDetails.2 - 40),240,40)


        //(LOOK HERE) BUTTON ACTION . What I want it to do is to reload html file when user taps on it
        refreshButton.addTarget(self, action: #selector(reload), forControlEvents: .TouchUpInside)
        self.view.addSubview(refreshButton)
    }

以下是refreshButton的功能。 当用户点击按钮时,它将调用重新加载功能。 我希望它重新加载本地文件。 我在上面添加了注释“ ERROR HERE”

    func reload(sender: UIButton!) {
        //ERROR HERE
        WebView.reload()

        let alertView = UIAlertController(title: "Message", message: "Track refreshed! Enjoy 🤘🏾✨", preferredStyle: .Alert)
        // Initialize Actions
        let okAction = UIAlertAction(title: "Ok", style: .Default) { (action) -> Void in
        }
        alertView.addAction(okAction)
        self.presentViewController(alertView, animated: true, completion: nil)
    }
}

我试图将html请求包含在reload函数中,并使用WebView.loadRequest(myRequest)而不是WebView.reload ,但该应用程序仍然崩溃。

您没有初始化在类级别声明的WebView 再次在viewDidLoad中创建另一个具有相同名称的变量

      let WebView = UIWebView(frame: CGRectMake(WebViewDetails.0, WebViewDetails.1, WebViewDetails.2, WebViewDetails.3))

因此,您在reload方法中使用的WebView不会初始化,因此会导致错误/崩溃。

删除WebView viewDidLoad let关键字。 一切都会正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM