iOS: как представить UIAlertController в iCloud Singleton? (Быстрый)

Я создаю Singleton для управления установкой и конфигурацией iCloud.

Как часть Руководства по дизайну iCloud, документ гласит: https://developer.apple.com/library/ios/documentation/General/Conceptual/iCloudDesignGuide/Chapters/iCloudFundametals.html

Листинг 1-4 Приглашение пользователя использовать iCloud

if (currentiCloudToken && firstLaunchWithiCloudAvailable) {
UIAlertView *alert = [[UIAlertView alloc]
                        initWithTitle: @"Choose Storage Option"
                              message: @"Should documents be stored in iCloud and
                                            available on all your devices?"
                             delegate: self
                    cancelButtonTitle: @"Local Only"
                    otherButtonTitles: @"Use iCloud", nil];
[alert show];
}

Я преобразовал это в UIAlertController в Swift, но как мне запустить self.presentViewController(alert, animated: true, completion: nil) из моего синглтона?

Очевидно, мой синглтон does not have a member named 'presentViewController'

Есть ли способ сделать это или мне нужно настроить уведомление о публикации, представить предупреждение где-то еще в моей программе, а затем сохранить/получить выбор пользователя?


person Richard    schedule 13.12.2014    source источник


Ответы (3)


1) Добавьте пользовательский делегат протокола в свой синглтон, и этот делегат вернет экземпляр UIViewController.

protocol TestSingletonDelegate : NSObjectProtocol {
    func responderViewControllerForTestSingleton(singleton: TestSingleton)->UIViewController
}

И в вашем классе:

let delegate: TestSingletonDelegate
func presentAlertView() {
    let alertView = UIAlertView();
    if (self.delegate.respondsToSelector("responderViewControllerForTestSingleton:")) {
        let viewController = self.delegate.responderViewControllerForTestSingleton(TestSingleton())
        viewController.presentViewController(alertView, animated: YES, completion: nil)
    }
}

2) Добавьте экземпляр var в свой класс singleton и переменную UIViewController истории.

person Vitalii Gozhenko    schedule 13.12.2014

У меня была та же проблема, я решил ее в своем случае, просто вернув alertController в синглтон, а затем представив его там.

В классе AlertView у меня есть приведенный ниже код для простого предупреждения, которое может принимать заголовок и сообщение в качестве входных данных и отображать только одну кнопку OK, чтобы отклонить предупреждение:

func alert(#alertTitle: String, alertMessage: String) -> UIAlertController {

    var alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .Alert)

    var okButton = UIAlertAction(title: "OK", style: .Default, handler: nil)

    alertController.addAction(okButton)

    return alertController

}

Обратите внимание, что в приведенном выше методе я не представляю контроллер предупреждений в представлении, а просто возвращаю его тому, кто когда-либо вызывал метод.

Затем в классе, где я вызвал метод, я делаю следующий код:

** Просто обратите внимание, что класс, в котором я вызываю предупреждение, является ViewController в Objective-C. Я также предоставлю быстрый код ниже **

// Creating an instance of the AlertView class and initializing it
AlertView *testAlert = [[AlertView alloc] init];

/* Creating a UIAlertController object and then calling the method I created in the AlertView class. This way the returned UIAlertController will be assigned to this UIAlertController
*/

UIAlertController *alertController = [testAlert alertWithAlertTitle:@"Genius!" alertMessage:@"Pure Genius"];


// Finally presenting the alert controller
[self presentViewController:alertController animated:true completion:nil];

ПРИМЕЧАНИЕ: я обнаружил, что вам нужно делать это вне ViewDidLoad. Это не работает в ViewDidLoad и дает следующую ошибку:

Attempt to present <UIAlertController: 0x1555118f0> on <ViewController: 0x155509790> whose view is not in the window hierarchy!

Вместо этого вы можете сделать это в методе viewDidAppear.

Теперь быстрая версия ViewController:

// Created a function to show the alert
func showAlert() {

    // Creating an instance of the AlertView class and initializing it
    var testAlert : AlertView = AlertView()

    /* Creating a UIAlertController object and then calling the method I created in the AlertView class. This way the returned UIAlertController will be assigned to this UIAlertController
    */
    var alertController : UIAlertController = testAlert.alert(alertTitle: "Genius", alertMessage: "Pure Genius")


    // Finally presenting the alert controller
    self.presentViewController(alertController, animated: true, completion: nil)
}

Еще одна вещь, если вы пытаетесь показать это предупреждение в синглтоне за пределами ViewController, тогда вы можете получить контроллер верхнего вида, как показано ниже, а затем представить ему контроллер предупреждения:

Цель - С:

UIViewController *topViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

[topViewController presentViewController:alertController animated:true completion:nil];

Быстрый:

if let topViewController = UIApplication.sharedApplication().keyWindow?.rootViewController? {

        topViewController.presentViewController(alertController, animated: true, completion: nil)

    }
person Taha Abbasi    schedule 25.06.2015

person    schedule
comment
Пожалуйста, добавьте (простой) текст, представляющий ваш ответ, спасибо. - person ; 13.09.2015