Подтвердить что ты не робот

Простой способ делегирования приложений для отображения UIAlertController (в Swift)

В obj-C, когда другое приложение iOS (вложение электронной почты, веб-ссылка) было использовано с файлом или ссылкой, связанной с моим приложением. Затем я поймал бы это на openURL или didFinishLaunchingWithOptions и покажу a 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

Я видел некоторые запутанные методы, чтобы получить AppDelegate для отображения UIAlertViewController в StackOverflow, но я надеялся, что что-то немного проще.

Все, что мне действительно нужно сделать, это показать пользователю быстрое сообщение о том, что у них есть некоторые данные и заставить их решить, что они хотят с ним делать. После этого мое приложение будет продолжать открываться и выходить на передний план (аналогичный код в didFinishLaunchingWithOptions для холодного запуска) либо с новыми добавленными данными, либо не на основе выбора предупреждения.

Я могу указать глобальную переменную, которая проверяет все мои функции viewWillAppear, но это было бы много дублирования, так как у меня есть 30 + просмотров.

Сообщите мне, есть ли у вас какие-либо идеи.

Спасибо

Грег

4b9b3361

Ответ 1

Попробуйте использовать

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

Все, что вам нужно, это объект viewController, чтобы отобразить AlertController.

В Swift 4:

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

Ответ 2

Используйте этот код для запуска alertCV из appdelegate

    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)
    })

Надеюсь, это поможет!

Ответ 3

Лучший способ, который я нашел, это следующее:

        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 отклоняется, так как в нем нет никаких кнопок.

Благодаря: fooobar.com/questions/140562/... Блестящий ответ о том, как представить UIAlertController из AppDelegate.

Ответ 4

Изнутри делегата приложения.

window.rootViweController.presentViewController...

Ответ 5

Принятый ответ в Swift 3, если он помогает кому-либо:

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