UIWebView делегаты не запускаются в пользовательском классе - PullRequest
0 голосов
/ 17 мая 2018

Я потратил около 5 часов на поиск StackOverFlow о том, как реализовать это, и я до сих пор не нашел решения!

Я создал новое приложение iOS Swift, просто чтобы объяснить вам, что именно я пытаюсьразрешить.

Во-первых, у меня есть UIButton на главной раскадровке, и когда вы нажимаете на нее, она создает новый объект из класса WebViewAsPopup, который создает программно новый WebView и фон в виде UIView с альфа-0.5, добавьте немного стилей, а затем добавьте их в контроллер основного вида ViewController как всплывающее окно.

Во-вторых, я не смог назначить делегат этим WebView's для обработки UIWebViewDelegate и слушайте оба webViewDidStartLoad и webViewDidFinishLoad

Вот мой код:

ViewController.swift

//
//  ViewController.swift
//  MySimpleApp
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var showPopupBtn: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

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


    @IBAction func showPopupTapped(_ sender: Any) {
        let popup = WebViewAsPopup()
        popup.showWebViewPopup(on: self)
    }

}

WebViewAsPopup.swift

//
//  WebViewAsPopup.swift
//  MySimpleApp
//

import WebKit

class WebViewAsPopup: NSObject, UIWebViewDelegate {

    func showWebViewPopup(on controller: UIViewController) {
        // Popup background
        let bg = UIView()
        bg.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
        bg.layer.backgroundColor = UIColor.black.withAlphaComponent(0.5).cgColor

        // Webview sizing
        let width = UIScreen.main.bounds.width - 60
        let height = UIScreen.main.bounds.height - 200
        let x = UIScreen.main.bounds.width/2 - width/2
        let y = UIScreen.main.bounds.height/2 - height/2

        // Webview stuff
        let webView = UIWebView()
        webView.frame = CGRect(x: x, y: y, width: width, height: height)
        let url = URL(string: "https://google.com")
        let request = URLRequest(url: url!)
        // webView.delegate = self << it crash here
        webView.loadRequest(request)

        // Styling webview popup
        webView.layer.borderWidth = 1
        webView.layer.borderColor = UIColor.black.cgColor
        webView.layer.masksToBounds = true
        webView.layer.cornerRadius = 10

        // Add bg then webview to main view controller
        controller.view.addSubview(bg)
        controller.view.addSubview(webView)
    }

    func webViewDidStartLoad(_ webView: UIWebView)
    {
        print("#webViewDidStartLoad!") // << it doesn't fire :(
    }
    func webViewDidFinishLoad(_ webView: UIWebView)
    {
        print("#webViewDidFinishLoad!") // << it doesn't fire :(
    }

}

1 Ответ

0 голосов
/ 17 мая 2018

Как я отмечал в моих комментариях, вам нужно где-то сохранить всплывающий объект, чтобы сохранить его. Если нет (как в вашем примере кода), то он будет освобожден, как только будет завершен метод действия showPopupTapped(_:).

Попробуйте это:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var showPopupBtn: UIButton!

    let popup = WebViewAsPopup()

    @IBAction func showPopupTapped(_ sender: Any) {
        self.popup.showWebViewPopup(on: self)
    }

}

Бонус Примечание:

Если вам интересно, почему вам не нужно делать то же самое с фоновым представлением и веб-представлением в вашем всплывающем объекте, это происходит потому, что представления автоматически сохраняют свои подпредставления.

Итак, как только вы добавите фоновое представление и веб-представление в качестве подпредставлений к родительскому представлению, их количество сохранений возрастет и сохранит текущую область действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...