web-dev-qa-db-ja.com

UIAlertControllerを表示する単純なアプリデリゲートメソッド(Swift内)

Obj-Cで、別のiOSアプリ(メールの添付ファイル、Webリンク)が、アプリに関連付けられたファイルまたはリンクでタップされたとき。次に、openURLまたはdidFinishLaunchingWithOptionsでこれをキャッチし、UIAlertViewを表示して、ユーザーがデータをインポートすることを確認します。 UIAlertViewが減価償却された今、私は同じことをしようとしていますが、これを行うための最良の方法については確かではありませんか?

アプリが別のアプリからデータを受信したときに、簡単なアラートを表示できません。このコードは、Objective-Cで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;
}

しかし、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
}

AppDelegateにはpresentViewControllerという名前のメンバーがないというコンパイル時エラーが表示されます

StackOverflowでAppDelegateを表示するUIAlertViewControllerを取得する複雑なメソッドを見てきましたが、少し簡単なものがあればいいのにと思っていました。

本当に必要なのは、データを取得したという簡単なメッセージをユーザーに表示し、そのデータで何をしたいかを決定させることです。完了すると、新しいデータが追加されたか、アラートの選択に基づいていない場合でも、アプリは引き続き開いてフォアグラウンドになります(コールドスタート用のdidFinishLaunchingWithOptionsの同様のコード)。

すべてのviewWillAppear funcでチェックするグローバル変数にフラグを立てることができますが、30以上のビューがあるため、これは多くの重複を伴​​います。

アイデアがあれば教えてください。

ありがとう

グレッグ

38
Greg Robertson

使用してみてください

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

必要なのは、AlertControllerを提示するviewControllerオブジェクトだけです。

In Swift 4:

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

このコードを使用して、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)
    })

お役に立てれば!

20
Aditya Gaonkar

私が見つけた最良の方法は次のとおりです。

        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
        }

タイマーを追加して、UIAlertControllerにボタンがないため、UIAlertControllerが閉じられるようにしました。

おかげで: https://stackoverflow.com/a/33128884/6144027 AppDelegateからUIAlertControllerを提示する方法についての素晴らしい答え。

2
Marie Amida

アプリデリゲート内から。

window.rootViweController.presentViewController..

1
Daniel T.

Swift 3で受け入れられた回答は、誰かを助ける場合:

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