Swift:(预)从 initialViewController 加载 UIWebView

Posted

技术标签:

【中文标题】Swift:(预)从 initialViewController 加载 UIWebView【英文标题】:Swift: (Pre-)load UIWebView from initialViewController 【发布时间】:2016-05-09 13:24:13 【问题描述】:

我有两个 ViewController。初始 ViewController 是输入和存储 URL 的位置。这个初始 ViewController 的 viewDidLoad 也应该在应用启动时开始为第二个 ViewController 加载网页内容。

secondViewController 仅包含一个 WebView。

当我启动应用程序时,成功调用了 secondViewController 中的 func loadWebView。但是,一旦我单击 goButton 以呈现 secondViewController。它是空的。 (在secondViewController viewDidLoad本地调用func loadWebView会成功加载网站。)

我认为我在实例化 secondViewController 的方式和调用它的方式上做错了。我想我以某种方式创建了 secondViewController 的两个不同实例并调用了空的实例。我会很高兴任何指针。

编辑:我希望应用程序在打开初始 ViewController 后立即开始加载网站。不仅在我访问 secondViewController 时。

EDIT2:问题可能是 webView.loadRequest(request) 的初始调用的数据没有保存到 webView-subview 吗?第二次调用 webView 时它出现空白,因为没有保存数据。有谁知道如何从 loadRequest 调用中保存/加载数据?

EDIT3:忘记 EDIT2。阅读解决方案正确答案下方的 cmets!

初始视图控制器:

var svc: UIViewController = UIViewController()

override func viewDidLoad() 
    loadWebView("https://www.google.com")


func loadWebView(URLString:String) 

    if let theRequestURL = NSURL (string: URLString) 
    let theRequest = NSURLRequest (URL: theRequestURL) 

    let vc: secondViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("secondViewController") as! secondViewController

        vc.loadWebView(theRequest)
        svc = vc
     


@IBAction func goButton(sender: AnyObject) 
        self.presentViewController(svc, animated: false, completion: nil)

secondViewController:

class secondViewController: UIViewController, UIWebViewDelegate 
    @IBOutlet var webView: UIWebView! = UIWebView()

func loadWebView(request : NSURLRequest) 
    webView.loadRequest(request)
    

【问题讨论】:

【参考方案1】:

我不太确定secondViewController 的两个实例,但可能webView 的两个实例...假设您在情节提要中定义了一个。实例化 IBOutlet 是异常/错误的。

我建议将loadWebView 变成storeRequestURL 之类的东西。将请求保存到一个实例变量,然后在secondViewControllerviewWillAppear(或者可能是viewDidLoad)中调用loadRequest

【讨论】:

我是否错误地假设您的建议 loadRequest 只会在调用 secondViewController 时启动?我希望在打开 initialViewController 后立即加载网站。基本上已经预加载了网站,所以当我转到 secondViewController 时它会立即出现。 在这种情况下,您可能会尝试不将 Web 视图设为插座,并且(因此)不在情节提要中定义/连接它。相反,您可以在代码中创建它——就像现在一样——然后在视图加载后将它作为子视图添加到控制器的视图中。 (然后您的代码负责大小和定位。) 我从情节提要中删除了 WebView,它是 secondViewController 的出口。创建 var webView: UIWebView = UIWebView(frame: CGRectMake(0, 20, 420, 725)) 并调用 viewWillAppear self.view.addSubview(webView)。但是,情况和以前一样。当从初始 ViewController 调用时,WebView 出现空白。在 secondViewController 的 viewDidLoad 中运行 loadWebView 会显示站点。 您认为问题可能是webView.loadRequest(request) 的初始调用的数据没有保存到webView 子视图?第二次调用webView 时它出现空白,因为没有保存任何数据。你知道如何保存来自loadRequest 调用的数据吗? 发生了一些我们没有看到的事情。我刚刚创建了一个新项目并使用代码设置它以匹配您从“我删除了 WebView ...”开始的评论,它对我来说很好。当我点击按钮时,我得到了谷歌页面。您的按钮是否真的与动作相关联?如果你使用 Xcode 的 View Debugging,你会在屏幕上看到你的 web view 吗?

以上是关于Swift:(预)从 initialViewController 加载 UIWebView的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用地址预填充 ApplePay

在 UIPageViewControllers (Swift) 中预加载所有 UIViewControllers

Swift - 设备上不包含预填充的 SQLite 数据库

在 Xcode/Swift 中使用预设置视图

如何使用 swift 3 xcode 8 在核心数据中预加载数据库

使用 MagicalRecord 预填充数据库 (swift)。 -wal 日志创建,但是,数据未复制到数据库