Что вам нужно сделать, это использовать prepareForSegue:sender:
, чтобы установить свойство в вашем контроллере представления назначения. prepareForSegue:sender:
будет вызвано до того, как ваш начальный контроллер представления перейдет к любому конечному контроллеру представления. В рамках этой функции мы можем проверить, какая кнопка была нажата, и установить соответствующий URL-адрес в контроллере представления назначения.
Этот подход позволит вам использовать любые переходы между кнопками и контроллером представления назначения. Это означает, что вам просто нужно перетащить синюю линию от кнопок к контроллеру представления, которому вы хотите перейти.
1. Внутри вашей раскадровки создайте переход между вашимКонтроллер первого вида и ваш конечный контроллер вида. Это можно сделать, удерживая элемент управления, щелкнув первый контроллер представления в конструкторе интерфейса и перетащив его на целевой контроллер представления. Затем выберите тип перехода:
Теперь выберите этот переход и присвойте ему Identifier
«InitialVCToDestinationVC» в инспекторе атрибутов:
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
}
}
Конечный результат:
Вотссылка на проект Xcode, который я сделал выше GIF из: https://github.com/ChopinDavid/PrepareForSegue