Как передать разные URL в webView от некоторых кнопок в Swift? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть несколько кнопок в первом контроллере представления и webView во втором контроллере представления. Как передать разные URL из разных кнопок в веб-просмотр? Например, первая кнопка приведет к веб-сайту Google, а вторая - Facebook, но с использованием того же веб-просмотра. Нужно ли создавать разные сегменты для каждой кнопки или только для одной? Если использовать только одну, с чего мне начинать тянуть эту синюю линию (эту строку, когда вы держите клавишу управления)?

В первом viewController:

class CafesView: UIViewController {

    @IBOutlet weak var topBar: UIView!
    @IBOutlet weak var button1: MDCFloatingButton!
    @IBOutlet weak var button2: MDCRaisedButton!
    @IBOutlet weak var button3: MDCRaisedButton!
    @IBOutlet weak var button4: MDCRaisedButton!
    @IBOutlet weak var button5: MDCRaisedButton!
    @IBOutlet weak var button6: MDCRaisedButton!
    @IBOutlet weak var button7: MDCRaisedButton!
    @IBOutlet weak var button8: MDCRaisedButton!
    @IBOutlet weak var button9: MDCRaisedButton!

    let cafes = [
        "Banana Joe's",
        "College Eight Cafe",
        "Global Village",
        "Iveta",
        "Oakes Cafe",
        "Perk Coffee Bar",
        "Stevenson Coffee House",
        "Terra Fresca",
        "Vivas"
    ]

    var urlToPass: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        topBar.layer.shadowColor = UIColor.black.cgColor
        topBar.layer.shadowOpacity = 0.5
        topBar.layer.shadowOffset = CGSize(width: 0, height: 2)
        topBar.layer.shadowRadius = 5
        button1.layer.cornerRadius = 20
        button2.layer.cornerRadius = 20
        button3.layer.cornerRadius = 20
        button4.layer.cornerRadius = 20
        button5.layer.cornerRadius = 20
        button6.layer.cornerRadius = 20
        button7.layer.cornerRadius = 20
        button8.layer.cornerRadius = 20
        button9.layer.cornerRadius = 20

    }

    @IBAction func bananaJoes(_ sender: UIButton) {
        urlToPass = "https://dining.ucsc.edu/pdf/banana-joes-menu.pdf"
    }

    @IBAction func collegeEightCafe(_ sender: UIButton) {
        urlToPass = "https://dining.ucsc.edu/pdf/c8-menu.pdf"
    }

    @IBAction func globalVillage(_ sender: Any) {
        urlToPass = "https://www.foodbooking.com/ordering/restaurant/menu?restaurant_uid=d368abee-3ccc-40d7-be7f-3ca5d4cbd513&glfa_cid=1263531392.1571083521&glfa_t=1571083566919"
    }

    @IBAction func iveta(_ sender: UIButton) {
        urlToPass = "https://iveta.com/pages/iveta-ucsc-menu"
    }

    @IBAction func oakesCafe(_ sender: UIButton) {
        urlToPass = "https://dining.ucsc.edu/pdf/oakes-menu-2019-20.pdf"
    }

    @IBAction func perkCoffeeBar(_ sender: UIButton) {
        urlToPass = "https://google.com" //This url is just a placeholder
    }

    @IBAction func stevensonCoffeeHouse(_ sender: UIButton) {
        urlToPass = "https://dining.ucsc.edu/pdf/stevenson-coffee-house-menu.pdf"
    }

    @IBAction func terraFresca(_ sender: UIButton) {
        urlToPass = "https://dining.ucsc.edu/terra-fresca/pdf/terra-fresca-menu.pdf"
    }

    @IBAction func vivas(_ sender: UIButton) {
        urlToPass = "https://dining.ucsc.edu/pdf/vivas-menu.pdf"
    }

    @IBAction func dismiss(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)
        guard let destination = segue.destination as? CafesMenu else { return }

        destination.detailURL = urlToPass
        urlToPass = nil
    }

}

Во втором:

import UIKit
import WebKit

class CafesMenu: UIViewController {

    @IBOutlet weak var webView: WKWebView!

    var detailURL: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        print("URL Requested: \(detailURL)")
    }

    override func viewWillAppear(_ animated: Bool) {
        let url = URL(string: detailURL!)
        let request = URLRequest(url: url!)
        webView.load(request)
    }

    @IBAction func dismiss(_ sender: UIBarButtonItem) {
        self.dismiss(animated: true, completion: nil)
    }

}

Ответы [ 3 ]

0 голосов
/ 14 октября 2019

Что вам нужно сделать, это использовать prepareForSegue:sender:, чтобы установить свойство в вашем контроллере представления назначения. prepareForSegue:sender: будет вызвано до того, как ваш начальный контроллер представления перейдет к любому конечному контроллеру представления. В рамках этой функции мы можем проверить, какая кнопка была нажата, и установить соответствующий URL-адрес в контроллере представления назначения.

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

1. Внутри вашей раскадровки создайте переход между вашимКонтроллер первого вида и ваш конечный контроллер вида. Это можно сделать, удерживая элемент управления, щелкнув первый контроллер представления в конструкторе интерфейса и перетащив его на целевой контроллер представления. Затем выберите тип перехода:

enter image description here

Теперь выберите этот переход и присвойте ему Identifier «InitialVCToDestinationVC» в инспекторе атрибутов:

enter image description here

2. Создайте свойство с именем urlToPass типа URL в контроллере начального представления:

class InitialViewController: UIViewController {
    var urlToPass: URL!

    @IBAction func googleButtonPressed(_ sender: Any) {
    }

    @IBAction func facebookButtonPressed(_ sender: Any) {
    }
}

3. Создайте свойство с именем receivedUrl в контроллере представления назначения:

class DestinationViewController: UIViewController {
    var receivedUrl: URL!

    @IBOutlet var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let request = URLRequest(url: receivedUrl)
        webView.load(request)
    }
}

4. Установите urlToPass в зависимости от того, какая кнопканажмите и используйте функцию prepareForSegue:sender: для установки URL-адреса контроллера вида назначения соответственно. Затем используйте performSegue(withIdentifier:sender:) для выполнения перехода с идентификатором InitialVCToDestinationVC.

class InitialViewController: UIViewController {
    var urlToPass: URL!

    @IBAction func googleButtonPressed(_ sender: Any) {
        urlToPass = URL(string: "www.google.com")
        performSegue(withIdentifier: "InitialVCToDestinationVC", sender: nil)
    }

    @IBAction func facebookButtonPressed(_ sender: Any) {
        urlToPass = URL(string: "www.facebook.com")
        performSegue(withIdentifier: "InitialVCToDestinationVC", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        super.prepare(for: segue, sender: sender)

        guard let destination = segue.destination as? DestinationViewController else { return }

        destination.receivedUrl = urlToPass
        urlToPass = nil
    }
}

5. (необязательно) Используйте метод shouldPerformSegueWithIdentifier:sender: в InitialViewController и проверьте, действительно ли urlToPass допустим. Если urlToPass является действительным, выполните переход, иначе представьте предупреждение.

class InitialViewController: UIViewController {

    ...

    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        if let urlToPass = urlToPass {
            // check if your application can open the NSURL instance
            if !UIApplication.shared.canOpenURL(urlToPass) {
                let alertController = UIAlertController(title: "Cannot open URL.", message: "This is an invalid URL.", preferredStyle: .alert)
                let ok = UIAlertAction(title: "Okay", style: .cancel, handler: nil)
                alertController.addAction(ok)
                present(alertController, animated: true, completion: nil)
            }
            return UIApplication.shared.canOpenURL(urlToPass)
        }
        return false
    }
}

Конечный результат:

enter image description here

Вотссылка на проект Xcode, который я сделал выше GIF из: https://github.com/ChopinDavid/PrepareForSegue

0 голосов
/ 14 октября 2019

Прежде всего, создайте enum WebURL со всеми URL-адресами, которые вы хотите открыть, т.е.

enum WebURL {
    case google
    case facebook

    var url: String {
        switch self {
        case .google:
            return "https://www.google.com"
        case .facebook:
            return "https://www.facebook.com"
        }
    }
}

Далее, в FirstVC, в UIButton's @IBAction open SecondVC с использованием экземпляра WebURL, соответствующего этой конкретной кнопке, то есть

class FirstVC: UIViewController{
    @IBAction func openGoogle(_ sender: UIButton) {
        self.openSecondVC(with: WebURL.google.url)
    }

    @IBAction func openFacebook(_ sender: UIButton) {
        self.openSecondVC(with: WebURL.facebook.url)
    }

    func openSecondVC(with urlString: String) {
        if let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondVC") as? SecondVC {
            vc.urlString = urlString
            self.present(vc, animated: true, completion: nil)
        }
    }
}

Затем используйте urlString в SecondVC для настройки webView, то есть

class SecondVC: UIViewController {
    var urlString: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        //Setup your webView using urlString here...
    }
}
0 голосов
/ 14 октября 2019

Попробуйте использовать следующий фрагмент кода, чтобы передать параметр urlParameter во второй viewcontroller

class FirstViewController: UIViewController{


    func googleActionButton() {
        let vc = SecondViewController()
        vc.urlToOpen = "www.google.com"
        self.present(vc, animated: true, completion: nil)
    }

    func facebookActionButton() {
        let vc = SecondViewController()
        vc.urlToOpen = "www.facebook.com"
        self.present(vc, animated: true, completion: nil)
    }

}

class SecondViewController: UIViewController{

    var urlToOpen = String()

    override func viewDidLoad() {
    super.viewDidLoad()

        //  set webview url to the 'urlToOpen' which you received from FirstViewController
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...