У меня есть UINavigationController, к которому я добавляю UIViewController. Внутри моего UIViewController у меня есть веб-просмотр, а также я пытаюсь установить UIActivityIndicatorView. Однако я не могу получить UIActivityIndicatorView, чтобы показать. Любая помощь будет отличной!

class TestWebViewController: UIViewController {

    var loadSpinner: UIActivityIndicatorView!

    var webView: UIWebView!

    var title: String?

    init(title: String?) {
       self.title = title

       self.webView = UIWebView(frame: CGRect.zero)
       super.init(nibName: nil, bundle: nil)
       commonInit()
    }

    func commonInit() {
       loadSpinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)
       loadSpinner.center = webView.center
       view.addSubview(loadSpinner)
       webView.delegate = self
       view = webView
    }

    required init?(coder aDecoder: NSCoder) {
       fatalError("init(coder:) has not been implemented")
    }

UINavigationController(rootViewController: testWebViewController)

Даже когда я пытаюсь добавить loadSpinner в webView, он не появляется webView.addSubview(loadSpinner)

0
sideshowbob 3 Мар 2018 в 01:11

3 ответа

Лучший ответ

Результат: введите описание изображения здесь

Код:

class ViewController: UIViewController {

var loadSpinner: UIActivityIndicatorView!
var webView: UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.webView = UIWebView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

    loadSpinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)

    webView.addSubview(loadSpinner)

    view = webView

    loadSpinner.startAnimating()
}

override func viewDidLayoutSubviews() {
    loadSpinner.center = webView.center
}
}
2
Tung Fam 2 Мар 2018 в 22:29

Вам нужно выполнить рефакторинг своего кода следующим образом viewDidLoad

class TestWebViewController: UIViewController {

    var loadSpinner: UIActivityIndicatorView!

    var webView: UIWebView!

    var title: String?

    override func viewDidLoad()
    {
        super.viewDidLoad()

        webView = UIWebView(frame:self.view.frame)

        webView.delegate = self

        self.view.addSubview(webview)

        loadSpinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)

        self.view.addSubview(loadSpinner)

        loadSpinner.center = self.view.center

        loadSpinner.startAnimating()
    }
}   
0
Sh_Khan 2 Мар 2018 в 22:24

Ваша основная проблема заключается в том, что вы сначала добавляете индикатор активности в представление контроллера представления, но двумя строками позже вы заменяете представление контроллера представления веб-представлением.

Если вы собираетесь заменить представление контроллера представления, вы должны сделать это в loadView. Вам также следует настроить другие представления в viewDidLoad, а не в методе init.

Самое простое изменение - избавиться от вашего метода commonInit и поместить весь этот код в viewDidLoad. Затем в viewDidLoad сначала настройте веб-представление, затем настройте индикатор активности.

class TestWebViewController: UIViewController {
    var loadSpinner: UIActivityIndicatorView!
    var webView: UIWebView!
    var title: String?

    init(title: String?) {
       self.title = title

       super.init(nibName: nil, bundle: nil)
    }

    override func loadView() {
        // don't call super

       webView = UIWebView(frame: CGRect.zero)
       webView.delegate = self
       view = webView
    }

    override func viewDidLoad() {
       super.viewDidLoad()

       loadSpinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)
       loadSpinner.center = view.center
       // Keep it in the center
       loadSpinner.autoresizingMask = [.flexibleWidth, .flexibleLeftMargin, .flexibleRightMargin]
       view.addSubview(loadSpinner)
    }

    required init?(coder aDecoder: NSCoder) {
       fatalError("init(coder:) has not been implemented")
    }

У вас также есть проблема с title. UIViewController уже имеет свойство title. Вы не должны добавлять свои собственные.

1
rmaddy 2 Мар 2018 в 22:46