UIWebView委托不更改其他视图

时间:2016-11-30 01:02:09

标签: ios swift webview

我在webView下的简单应用程序中有一个UIImageView。我打算显示UIImageView,直到webView加载一些数据并在Web视图委托中触发方法。 Webview加载数据,委托方法称为精细。但是,我无法操纵UIImageView等其他视图。

这是我的代码;

class ViewController: UIViewController,UIWebViewDelegate {
    //contains the imageView and activityWorkingIndicator 
    @IBOutlet weak var splash_view: UIView!
    @IBOutlet var contentWebView: UIWebView!
    //Contains the Webview and other views to be displayed after the splash his hidden
    @IBOutlet weak var splash_view_not: UIView!

    override func viewWillAppear(animated: Bool)
    {
        contentWebView?.scrollView.bounces = false;
        contentWebView?.delegate = self
        let url  = NSURL(string: "http://localhost/something/");
        let request = NSURLRequest(URL: url!);
        contentWebView?.loadRequest(request);
    }

    ....

    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if let scheme = request.URL?.scheme {
            if scheme == "myRequestScheme"{
                let task : String = (request.URL?.host)!;
                switch task {
                    case "systemReady":
                       print("checkpoint 1");//works fine
                       splash_view?.hidden = true;//no effect at all
                       splash_view_not?.hidden = false;//no effect at all
                       print("checkpoint 2");//works fine
                       break;
                    default:
                    break
                }
            }
        }

        return true;
    }
}

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

看起来您正在使用自动布局。如果是这种情况,使用.hidden会产生比你想象的更多的含义。如果在加载视图后在方法中调用它,则需要使用约束而不是隐藏。有些人创建约束出口并将它们设置为活动以隐藏事物。有些人设置alpha并将子视图放在前面以隐藏内容等。

我相信这是首选方式: http://candycode.io/hiding-views-with-auto-layout/

这是一个堆栈溢出线程,其中包含大量有关使用AutoLayout隐藏内容的最佳选项的信息: AutoLayout with hidden UIViews?

答案 1 :(得分:0)

您应该在主线程上的委托方法中隐藏或显示任何控件。

像这样使用

DispatchQueue.main.async { 
      splash_view_not?.hidden = false
}