Ios 使用从AppDelegate传递的参数覆盖ViewController viewDidLoad方法参数
在我的Ios 使用从AppDelegate传递的参数覆盖ViewController viewDidLoad方法参数,ios,swift,Ios,Swift,在我的AppDelegate.swift中,我从我的ViewController.swift访问和调用方法,如下所示 let storyboard = UIStoryboard(name: "Main", bundle: nil) if let controller = storyboard.instantiateViewController(withIdentifier: "ShitstuffController") as? ViewController { controller.lo
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
}
其中overridewviewUrl
是一个ViewController
方法
func overrideWebViewURL(url: String) {
notificationProvidedLink = url;
isDidLaunchFromNotification = true;
print(" ----- Link is set");
}
主要思想是在调用controller.loadViewIfNeeded()之前调用它
在AppDelegate
中,要覆盖我在ViewController
的viewDidLoad
中加载的默认url,下面是完整的逻辑代码
// 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
但是为什么呢?为什么加载“默认”url?您不应该这样做 只需将属性添加到视图控制器:
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"
您实际在何处显示此视图控制器?我的猜测是,您有一个
ViewController
的副本在启动时自动加载,这个副本您修改了,但从未显示。Em,但如果您是对的,它如何将修改后的url打印到控制台?我以为loadViewIfNeeded
方法显示了我修改的ViewController
,实际上我发布了用于此逻辑的所有代码,我没有什么要添加的:|添加了self.window?.rootViewController=controller
到AppDelegate
方法结束,它可以工作!!它加载我需要的url!我将进一步检查一些变体,如果它有效,您将帮助我!这是有道理的loadViewIfNeeded
将视图带入内存,但不影响显示。只要选中,一切正常,如果您感兴趣,可以添加self.window?.rootViewController=controller代码>解决方案作为答案,我接受它!:)
let viewController = MyViewController()
viewController.link = "www.mylink.com"