Переопределить параметр ViewController viewDidLoad с параметром, переданным из AppDelegate

64
9

В моем AppDelegate.swift я AppDelegate.swift и AppDelegate.swift методы из моего ViewController.swift как это

let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let controller = storyboard.instantiateViewController(withIdentifier: "ShitstuffController") as? ViewController {
controller.loadViewIfNeeded();
controller.viewControllerCustomMethod(); // <-- method from ViewController.swift
}

и простой вызов метода, который возвращает что-то, работает нормально, но в моей ситуации мне нужно изменить URL-адрес запроса WKWebView который загружен в viewDidLoad метод ViewController, и я пытаюсь достичь его таким образом

let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let controller = storyboard.instantiateViewController(withIdentifier: "ShitstuffController") as? ViewController {
controller.overrideWebViewURL(url: "https://google.com");
controller.loadViewIfNeeded();
}

где overrideWebViewURL - это метод ViewController который выглядит так

func overrideWebViewURL(url: String) {
notificationProvidedLink = url;
isDidLaunchFromNotification = true;

print(" ----- Link is set");
}

Основная идея - вызвать его перед вызовом controller.loadViewIfNeeded(); в AppDelegate переопределить url по умолчанию, что я загружаю в viewDidLoad ViewController, вот полный код логики

// AppDelegate.swift
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let controller = storyboard.instantiateViewController(withIdentifier: "ShitstuffController") as? ViewController {
controller.overrideWebViewURL(url: link);
controller.loadViewIfNeeded();
}

//ViewController.swift

var isDidLaunchFromNotification = false
var notificationProvidedLink = "";

func overrideWebViewURL(url: String) {
notificationProvidedLink = url;
isDidLaunchFromNotification = true;

print(" ----- Link is set");
}

override func viewDidLoad() {
super.viewDidLoad()

print(" ----- View did load");

print(isDidLaunchFromNotification);
print(notificationProvidedLink);

var url = URL(string: "https://amazon.com");
if(isDidLaunchFromNotification == true && notificationProvidedLink != "") {
url = URL(string: notificationProvidedLink);
}

var urlRequest = URLRequest(url: url!);

webView.navigationDelegate = self;
webView.uiDelegate = self;

print(urlRequest);

webView.load(urlRequest);
}

вот проблема, несмотря на то, что я фактически переопределяю URL-адрес запроса (я могу видеть его с помощью консольного вывода), ViewController все еще загружает меня amazon, а не google.

Журнал консоли

 ----- Link is set
----- View did load
true
https://google.com
https://google.com

но почему? Почему он загружает "default" url?

спросил(а) 2021-01-25T22:35:40+03:00 4 месяца, 4 недели назад
1
Решение
63

Вы не должны так поступать.

Просто добавьте свойство в свой контроллер:

var link: String {
didSet {
let url = URL(string: link)
var urlRequest = URLRequest(url: url!)

webView.navigationDelegate = self
webView.uiDelegate = self
webView.load(urlRequest)
}
}

В приложении appDelegate:

let viewController = MyViewController()
viewController.link = "www.mylink.com"

ответил(а) 2021-01-25T22:35:40+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема