显示UIAlertController的简单App委托方法(Swift格式)

时间:2023-01-24 08:35:53

In obj-C when another iOS app (mail attachment, web link) was tapped with a file or link associated with my app. I would then catch this on openURL or didFinishLaunchingWithOptions and show a UIAlertView to confirm the user wants to import the data. Now that UIAlertView is depreciated I am trying to do the same thing but not really sure about the best way to do this?

在objc中,当另一个iOS应用程序(邮件附件,web链接)被与我的应用程序关联的文件或链接时,我将在openURL或didFinishLaunchingWithOptions上捕捉这个,并显示一个UIAlertView来确认用户想要导入数据。现在UIAlertView被折旧了我也想做同样的事情但不确定最好的方法是什么?

I am having trouble showing a simple alert when my App receives data from another app. This code worked fine in Objective-C with a UIAlertView:

当我的应用程序从另一个应用程序接收数据时,我无法显示简单的警报。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if (url)
    {
        self.URLString = [url absoluteString];
        NSString *message = @"Received a data exchange request. Would you like to import it?";
        importAlert = [[UIAlertView alloc] initWithTitle:@"Data Received" message:message delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
        [importAlert show];
    }

    return YES;
}

But when I try and switch to UIAlertViewController and Swift I can't seem to find a simple way to display the message:

但是当我尝试切换到UIAlertViewController和Swift时,我似乎找不到显示消息的简单方法:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    let URLString: String = url.absoluteString!
    let message: String = "Received data. Would you like to import it?"

    var importAlert: UIAlertController = UIAlertController(title: "Data Received", message: message, preferredStyle: UIAlertControllerStyle.Alert)
    importAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
    importAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler:
    { action in
        switch action.style {
        case .Default:
            println("default")  
        case .Cancel:
            println("cancel")   
        case .Destructive:
            println("destructive")
        }
    }))

    self.presentViewController(importAlert, animated: true, completion: nil)
    return true
}

I get a compile time error that AppDelegate does not have a member named presentViewController

我得到一个编译时错误AppDelegate没有名为presentViewController的成员

I have seen some convoluted methods to get the AppDelegate to display an UIAlertViewController on * but I was hoping there was something a little simpler.

我看到了一些复杂的方法来让AppDelegate在*上显示UIAlertViewController但是我希望有一些更简单的东西。

All I really need to do is show the user a quick message that they got some data and have them decide what they want to do with it. Once were done my app will continue to open and come to foreground (similar code in didFinishLaunchingWithOptions for cold start) with either the new data added or not based on the alert selection.

我真正需要做的就是向用户显示一个快速消息,告诉他们他们得到了一些数据,并让他们决定要用这些数据做什么。完成后,我的应用程序将继续打开并出现在前台(类似的代码在didfinishlaunchingingwithoptions中用于冷启动),并根据警报选择添加或不添加新数据。

I could flag a global variable that I check in all my viewWillAppear func but this would be a lot of duplication since I have 30+ views.

我可以标记一个全局变量,在我的viewWillAppear func中选中它,但是由于我有30多个视图,这将会是大量的重复。

Let me know if you have any ideas.

如果你有什么想法就告诉我。

Thanks

谢谢

Greg

格雷格

5 个解决方案

#1


92  

Try using

试着用

self.window?.rootViewController?.presentViewController(importAlert, animated: true, completion: nil)

All you need is a viewController object to present the AlertController from.

你只需要一个viewController对象来显示AlertController。

In Swift 4:

在斯威夫特4:

self.window?.rootViewController?.present(importAlert, animated: true, completion: nil)

#2


20  

Use this code to launch alertCV from appdelegate

使用此代码从appdelegate启动alertCV

    dispatch_async(dispatch_get_main_queue(), {
          let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet)
        self.window?.rootViewController?.presentViewController(importantAlert, animated: true, completion: nil)
    })

Hope this helps!

希望这可以帮助!

#3


2  

The best way I've found is the following:

我找到的最好的方法是:

        let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet) //.Alert .ActionSheet
        var hostVC = UIApplication.sharedApplication().keyWindow?.rootViewController
        while let next = hostVC?.presentedViewController {
            hostVC = next
        }
        hostVC?.presentViewController(importantAlert, animated: true, completion: nil)


        let delay = 1.5 * Double(NSEC_PER_SEC)
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
        dispatch_after(time, dispatch_get_main_queue()) {

            importantAlert.dismissViewControllerAnimated(true, completion: nil)

            return
        }

I've added a timer so the UIAlertController is dismissed since it doesn't have any buttons in it.

我添加了一个定时器,UIAlertController被取消了因为它没有任何按钮。

Thanks to: https://*.com/a/33128884/6144027 Brilliant answer on how to present a UIAlertController from AppDelegate.

感谢:https://*.com/a/33128884/6144027关于如何从AppDelegate中呈现UIAlertController的精彩答案。

#4


1  

From inside the app delegate.

从应用委托里面。

window.rootViweController.presentViewController...

window.rootViweController.presentViewController……

#5


0  

The accepted answer in Swift 3 in case it helps anyone:

在Swift 3中被接受的答案,如果它对任何人都有帮助:

self.window?.rootViewController?.present(importAlert, animated: true, completion: nil)

#1


92  

Try using

试着用

self.window?.rootViewController?.presentViewController(importAlert, animated: true, completion: nil)

All you need is a viewController object to present the AlertController from.

你只需要一个viewController对象来显示AlertController。

In Swift 4:

在斯威夫特4:

self.window?.rootViewController?.present(importAlert, animated: true, completion: nil)

#2


20  

Use this code to launch alertCV from appdelegate

使用此代码从appdelegate启动alertCV

    dispatch_async(dispatch_get_main_queue(), {
          let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet)
        self.window?.rootViewController?.presentViewController(importantAlert, animated: true, completion: nil)
    })

Hope this helps!

希望这可以帮助!

#3


2  

The best way I've found is the following:

我找到的最好的方法是:

        let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet) //.Alert .ActionSheet
        var hostVC = UIApplication.sharedApplication().keyWindow?.rootViewController
        while let next = hostVC?.presentedViewController {
            hostVC = next
        }
        hostVC?.presentViewController(importantAlert, animated: true, completion: nil)


        let delay = 1.5 * Double(NSEC_PER_SEC)
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
        dispatch_after(time, dispatch_get_main_queue()) {

            importantAlert.dismissViewControllerAnimated(true, completion: nil)

            return
        }

I've added a timer so the UIAlertController is dismissed since it doesn't have any buttons in it.

我添加了一个定时器,UIAlertController被取消了因为它没有任何按钮。

Thanks to: https://*.com/a/33128884/6144027 Brilliant answer on how to present a UIAlertController from AppDelegate.

感谢:https://*.com/a/33128884/6144027关于如何从AppDelegate中呈现UIAlertController的精彩答案。

#4


1  

From inside the app delegate.

从应用委托里面。

window.rootViweController.presentViewController...

window.rootViweController.presentViewController……

#5


0  

The accepted answer in Swift 3 in case it helps anyone:

在Swift 3中被接受的答案,如果它对任何人都有帮助:

self.window?.rootViewController?.present(importAlert, animated: true, completion: nil)