показать alertController из пользовательского класса

Я пытаюсь показать AlertController из класса, который я сделал. Поскольку AlertController является подклассом UIResponder, я использую следующую строку кода, которую мне предлагает Xcode.

superclass?.presentViewController(alertController, animated: true, completion: nil)

Но я не могу скомпилировать, потому что AnyClass? не имеет члена presentViewController. Мой класс является подклассом NSObject.

Любое другое решение? Спасибо


person Nicholas    schedule 01.01.2015    source источник
comment
presentViewController - это метод UIViewController, а не NSObject   -  person Krumelur    schedule 02.01.2015
comment
@Krumelur Я знаю, но я пытаюсь показать UIAlertController из своего класса. Есть ли другой обходной путь?   -  person Nicholas    schedule 02.01.2015


Ответы (4)


Что ж, вам просто нужно найти самый верхний контроллер представления и представить оттуда alertcontroller.

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

while (topController.presentedViewController) {
    topController = topController.presentedViewController;
}
[topController presentViewController:alertController animated:YES completion:nil];

кредиты

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

СВИФТ

let topController = UIApplication.sharedApplication().keyWindow!.rootViewController as UIViewController

while (topController.presentedViewController) {
    topController = topController.presentedViewController;
}
topController.presentViewController(alertController, animated:true, completion:nil)
person Burhanuddin Sunelwala    schedule 25.03.2015
comment
Извините, но я попросил быстрый, и я не знаю, что делать с Obj C. Пожалуйста, рассмотрите возможность пересмотреть, используя быстрый язык - person Nicholas; 28.03.2015

Проблема в вашем понимании слова "от". Оповещение появляется перед каким-то представлением в интерфейсе. Таким образом, нам нужно знать какое представление. Ответ таков: основной вид некоторого вью-контроллера — вью-контроллер, основной вид которого находится в интерфейсе.

Таким образом, только тот контроллер представления, чье основное представление находится в интерфейсе, может получить предупреждение. Это тот контроллер представления, который вы должны представить "от".

Вам понадобится какой-то способ получить ссылку на этот контроллер представления, где бы ни находился ваш код, чтобы ваш код мог указать этому контроллеру представления представить предупреждение. Это само по себе может быть интересной проблемой; действительно, "получение ссылки" на существующий объект является основной частью искусства программирования Cocoa.

person matt    schedule 01.01.2015
comment
Это настолько важная проблема (получение ссылки), что я посвящаю ей целый раздел своей книги: apeth.com/iOSBook/ch13.html#_instance_visibility Это может дать вам некоторые идеи. - person matt; 02.01.2015
comment
Гений! Просто включите UIViewController в метод инициализации и вуаля. Готово. - person Nicholas; 02.01.2015

С нашей точки зрения, у контроллера есть ссылка контроллера, сообщение, заголовок, например

Settings.getAlertViewConroller(self, DialogTitle: "Test Sale", strDialogMessege: "You are performing a test sale. This is not a real transaction.")

где Setting является подклассом NSObject. В классе Setting вы должны определить метод как

class func getAlertViewConroller(globleAlert:UIViewController,DialogTitle:NSString,strDialogMessege:NSString){


    let actionSheetController: UIAlertController = UIAlertController(title: DialogTitle, message: strDialogMessege, preferredStyle: .Alert)


    let nextAction: UIAlertAction = UIAlertAction(title: "OK", style: .Default) { action -> Void in

    }
    actionSheetController.addAction(nextAction)

    globleAlert.presentViewController(actionSheetController, animated: true, completion:nil)

}

то есть представление UIAlertController.

person poojathorat    schedule 25.03.2015

Последний Свифт:

    var topController:UIViewController = UIApplication.shared.keyWindow!.rootViewController!
    while ((topController.presentedViewController) != nil) {
        topController = topController.presentedViewController!;
    }
    topController.present(alertController, animated:true, completion:nil)
person Hemang    schedule 04.07.2017