3D Touch快捷方式:加载其他URL

6

我已经实现了三个3D Touch动作,我们将它们命名为app.touch1app.touch2app.touch3

这是我AppDelegate文件中的代码:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    if(shortcutItem.type == "app.touch1"){
        MyVariables.url = "https://google.de/";
    } else if(shortcutItem.type == "app.touch2") {
        MyVariables.url = "https://yahoo.de/";
    } else if(shortcutItem.type == "app.touch3") {
        MyVariables.url = "https://bing.de/";
    }
}

这是我现在的MyVariables类:

struct MyVariables {
    static var url = "https://test.de/"
}

这是我ViewController类的代码:

IBOutlet var containerView : UIView?
var webView: UIWebView?
var loadedURL: String?

override func prefersStatusBarHidden() -> Bool {
    return true
}

override func loadView() {
    super.loadView()

    self.webView = UIWebView()
    self.view = self.webView!
}

override func viewDidLoad() {
    super.viewDidLoad()
    load()
}

func load() {
    let requestURL = NSURL(string: MyVariables.url)
    let request = NSURLRequest(URL: requestURL!)
    self.webView!.loadRequest(request)
    loadedURL = MyVariables.url
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

然而,即使应用程序之前已关闭,它总是加载默认的网址(https://test.de/)。我尝试使用 viewDidAppearviewWillAppear 这样的事件,但这并没有起作用。我认为对于 iOS 开发人员来说,这非常简单 - 我试图从 iOS 入手,却遇到了这个问题 :-(。

已经在您的AppDelegate中使用print(shortcutItem.type)进行了检查,哪个代码块会被执行? - derdida
@derdida:是的,那是正确的代码块。 - Richard
你成功让它工作了吗? - Fizzix
4个回答

3
问题在于您的ViewController类在应用程序委托完成启动之前被加载(因为它是根视图控制器),所以设置URL的代码在您发出请求时还没有被调用。
您需要做的是,要么使performActionForShortcutItem在ViewController上开始请求,要么找到另一种触发该代码的方法。

2

看起来这只是您的结构体的问题?

我建议在您的AppDelegate中设置一个全局变量,然后在您的ViewController中使用它。

例如:

在您的AppDelegate中创建一个url变量。

在您的ViewController中使用:

func load() {
    let delegate = UIApplication.sharedApplication().delegate as AppDelegate
    let requestURL = NSURL(string: delegate.url)
    let request = NSURLRequest(URL: requestURL!)
    self.webView!.loadRequest(request)
    loadedURL = MyVariables.url
}

试一下,应该可以工作。另一个想法是将其存储为Singleton,请在此处查看:

https://github.com/hpique/SwiftSingleton

或者(这取决于您想要存档的数据)-> 将其存储为NSUserDefaults()


这不是一个好的错误描述。什么没有工作?还有任何错误消息吗? - derdida
不,它只是没有加载正确的页面。和之前一样的问题。 - Richard
你尝试过什么?在这里使用你的委托变量了吗?发布更多代码,尝试调试该代码(因此添加一些“打印”语句以检查发生了什么) - derdida

0

我们的应用程序中有一个几乎完全相同的功能,您可以查看创建它的提交

主要部分包括:

1)在AppDelegate中检测所选的快捷方式项目

  • 您已经在做这个了。

2)创建并打开具有正确参数的新ViewController

参考我们的函数quickActionOpenHomePageForURL

func quickActionOpenHomePageForURL (stringURL:String) {
        if (navigationVC != nil) {
            if (navigationVC?.viewControllers.count > 0) {
                navigationVC?.popToRootViewControllerAnimated(false)
                let homepage = navigationVC?.viewControllers.last?.storyboard?.instantiateViewControllerWithIdentifier("HomePageViewController")
                (homepage as! HomePageViewController).serverURL  =  stringURL
                navigationVC?.pushViewController(homepage! as UIViewController, animated: false)
            }
        }        
    }

0

IanW所说:

问题在于您的ViewController类在应用程序代理完成启动之前被加载(因为它是根视图控制器),因此设置URL的代码在发出请求时尚未调用。

您需要做的是使performActionForShortcutItem在ViewController上启动请求,或找到另一种触发该代码的方式。

这个performActionForShortcutItem先执行,然后才执行UIAppDelegate类!

有很多方法可以更改URL: 1)使用NSNotificationCenter 2)取公共变量并更改URL 3)取Bool,然后您可以在您的ViewController中检查它,并基于此分配'URL'

示例:

首先,在UIAppDelegate类中取一个公共变量如下:

public var urlToLoad: String?

其次,在下面的方法被调用后,将URL分配给要加载的网址!
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    if(shortcutItem.type == "app.touch1"){
        urlToLoad = "https://google.de/";
    } else if(shortcutItem.type == "app.touch2") {
        urlToLoad = "https://yahoo.de/";
    } else if(shortcutItem.type == "app.touch3") {
        urlToLoad = "https://bing.de/";
    }
}

好了,现在您可以在任何UIViewController类中访问此变量。

func load() {
    let requestURL = NSURL(string: MyVariables.url)
    let request = NSURLRequest(URL: requestURL!)
    self.webView!.loadRequest(request)
    loadedURL = urlToLoad
}

1
很遗憾,您的示例无法正常工作。正如IanW所述:“问题在于您的ViewController类在App Delegate完成启动之前被加载” - ViewControllerAppDelegate之前加载。因此,似乎需要在AppDelegate完成其部分后调用ViewController中的函数。您的示例假定首先调用AppDelegate,然后是ViewController,因此使urlToLoad的值为nil - Fizzix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接