Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用从AppDelegate传递的参数覆盖ViewController viewDidLoad方法参数_Ios_Swift - Fatal编程技术网

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"