swiftwebviewwkwebviewwkwebviewconfiguration

Create multiple webviews in a for loop swift


I am attempting to display 5 web views and I would like the web views to be created in a for loop. The code I am currently using creates only one web view where it should create one for every url in pages. Any help would be appreciated!

import UIKit
import Foundation
import WebKit
import AVFoundation

class displayviews: UIViewController, WKUIDelegate {
    
    var pages = ["https://example.com", "https://example", "https://example", "https://example.com", "https://example.com"]
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        for i in pages{
            var inti = Int(i) ?? 0
            //var currentwebview = String("webView") + i
            let myWebView:WKWebView = WKWebView(frame: CGRect(x:0, y:CGFloat(inti*200), width: UIScreen.main.bounds.width, height:UIScreen.main.bounds.height/CGFloat(pages.count)))
            myWebView.uiDelegate = self
            self.view.addSubview(myWebView)
            //1. Load web site into my web view
            let myURL = URL(string: pages[inti])
            let myURLRequest:URLRequest = URLRequest(url: myURL!)
            myWebView.load(myURLRequest)
        }
    }
}

Solution

  • Your code is creating the 5 webviews, the problem is that they are being placed on top of each other and as such you can only see the top most one. You can either use a stackview like on the following example or set constraints on the webviews.

    class ViewController: UIViewController, WKUIDelegate {
        
        var pages = ["https://example.com", "https://example.com", "https://example.com", "https://example.com", "https://example.com"]
        
        lazy var stackView: UIStackView = {
            let view = UIStackView()
            view.axis = .vertical
            view.translatesAutoresizingMaskIntoConstraints = false
            view.distribution = .fillEqually
            self.view.addSubview(view)
            NSLayoutConstraint.activate([
                view.leftAnchor.constraint(equalTo: self.view.leftAnchor),
                view.topAnchor.constraint(equalTo: self.view.topAnchor),
                view.rightAnchor.constraint(equalTo: self.view.rightAnchor),
                view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
            ])
            return view
        }()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            for (inti, page) in pages.enumerated() {
                //var currentwebview = String("webView") + i
                let myWebView:WKWebView = WKWebView(frame: CGRect(x:0, y:CGFloat(inti*200), width: UIScreen.main.bounds.width, height:UIScreen.main.bounds.height/CGFloat(pages.count)))
                myWebView.uiDelegate = self
                //self.view.addSubview(myWebView)
                stackView.addArrangedSubview(myWebView)
                //1. Load web site into my web view
                let myURL = URL(string: page)
                let myURLRequest:URLRequest = URLRequest(url: myURL!)
                myWebView.load(myURLRequest)
            }
            
        }
    }