How to create uialertcontroller in global swift

后端 未结 12 1691
情深已故
情深已故 2020-12-05 12:09

I\'m trying to create uialertcontroller in Config.swift file as follow.

static func showAlertMessage(titleStr:String, messageStr:St         


        
相关标签:
12条回答
  • 2020-12-05 12:43

    If you want to present from AppDelegate windows you can use like this

    UIApplication.sharedApplication().delegate?.window.rootViewController?.presentViewController(vc, animated: true, completion: nil)
    
    0 讨论(0)
  • 2020-12-05 12:46

    Details

    • Swift 5.1, Xcode 11.3.1

    Global UIAlertController With UIViewController Extension

    extension UIViewController{
    
        // Global Alert
        // Define Your number of buttons, styles and completion
        public func openAlert(title: String,
                              message: String,
                              alertStyle:UIAlertController.Style,
                              actionTitles:[String],
                              actionStyles:[UIAlertAction.Style],
                              actions: [((UIAlertAction) -> Void)]){
    
            let alertController = UIAlertController(title: title, message: message, preferredStyle: alertStyle)
            for(index, indexTitle) in actionTitles.enumerated(){
                let action = UIAlertAction(title: indexTitle, style: actionStyles[index], handler: actions[index])
                alertController.addAction(action)
            }
            self.present(alertController, animated: true)
        }
    }
    

    Usage

    Alert

    self.openAlert(title: "alert",
                          message: "add your message",
                          alertStyle: .alert,
                          actionTitles: ["Okay", "Cancel"],
                          actionStyles: [.default, .cancel],
                          actions: [
                              {_ in
                                   print("okay click")
                              },
                              {_ in
                                   print("cancel click")
                              }
                         ])
    

    ActionSheet

    self.openAlert(title: "actionsheet",
                      message: "add your message",
                      alertStyle: .actionSheet,
                      actionTitles: ["Okay", "Cancel"],
                      actionStyles: [.default, .cancel],
                      actions: [
                          {_ in
                               print("okay click")
                          },
                          {_ in
                               print("cancel click")
                          }
                     ])
    
    0 讨论(0)
  • 2020-12-05 12:48

    self.window would mean that there's a window object in this class, and it's not the case.

    You would need to use your let window : UIWindow? with window?.presentViewController(alert, animated: true, completion: nil), but this won't help, since this window does not actually represent any existing window, and it's not a view controller anyway.

    So I suggest you pass the actual view controller you'll be using to the method:

    static func showAlertMessage(vc: UIViewController, titleStr:String, messageStr:String) -> Void {
        let alert = UIAlertController(title: titleStr, message: messageStr, preferredStyle: UIAlertControllerStyle.Alert);
        vc.presentViewController(alert, animated: true, completion: nil)
    }
    

    and you call it from a class where a UIViewController object is available.

    0 讨论(0)
  • 2020-12-05 12:48

    You can try this, please add below code in AppDelegate.swift file.

     static func showAlertView(vc : UIViewController, titleString : String , messageString: String) ->()
        {
            let alertView = UIAlertController(title: titleString, message: messageString, preferredStyle: .alert)
    
            let alertAction = UIAlertAction(title: "ok", style: .cancel) { (alert) in
                vc.dismiss(animated: true, completion: nil)
            }
            alertView.addAction(alertAction)
            vc.present(alertView, animated: true, completion: nil)
    
        }
    

    and call showAlertView method from any viewcontroller

    AppDelegate.showAlertView(vc: self, titleString: "testTitle", messageString: "test msg")
    
    0 讨论(0)
  • 2020-12-05 12:49

    swift

    Here's what I used, this is the same as @penatheboss answered, just add the ability of adding actions and handlers.

    extension UIViewController {
        func popupAlert(title: String?, message: String?, actionTitles:[String?], actions:[((UIAlertAction) -> Void)?]) {
            let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
            for (index, title) in actionTitles.enumerated() {
                let action = UIAlertAction(title: title, style: .default, handler: actions[index])
                alert.addAction(action)
            }
            self.present(alert, animated: true, completion: nil)
        }
    }
    

    Just make sure actionTitles and actions array the same count. Pass nil if you don't need any action handler closure.

    self.popupAlert(title: "Title", message: " Oops, xxxx ", actionTitles: ["Option1","Option2","Option3"], actions:[{action1 in
    
    },{action2 in
    
    }, nil])
    

    Objective C:

    Add the category for UIViewController

    UIViewController+PopAlert.h

    #import <UIKit/UIKit.h>
    
    @interface UIViewController (UIViewControllerCategory)
    - (void) popAlertWithTitle: (NSString*) title message: (NSString*) message actionTitles:(NSArray *) actionTitles actions:(NSArray*)actions;
    @end
    

    UIViewController+PopAlert.m

    #import "UIViewController+PopAlert.h"
    
    @implementation UIViewController (UIViewControllerCategory)
    - (void) popAlertWithTitle: (NSString*) title message: (NSString*) message actionTitles:(NSArray *) actionTitles actions:(NSArray*)actions {
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
        [actionTitles enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            UIAlertAction *action = [UIAlertAction actionWithTitle:obj style:UIAlertActionStyleDefault handler:actions[idx]];
            [alert addAction:action];
        }];
        [self presentViewController:alert animated:YES completion:nil];
    }
    @end
    

    Usage:

    #import UIViewController+PopAlert.h
    

    ...

    [super viewDidDisappear:animated];
        NSArray *actions = @[^(){NSLog(@"I am action1");}, ^(){NSLog(@"I am action2");}];
        [self popAlertWithTitle:@"I am title" message:@"good" actionTitles:@[@"good1", @"good2"] actions:actions];
    
    0 讨论(0)
  • 2020-12-05 12:52

    I created a alerMessage class .I can call any where in my application

    //Common Alert Message Class 
    
    class AlertMessage {
    
    internal static var alertMessageController:UIAlertController!
    
    internal static func disPlayAlertMessage(titleMessage:String, alertMsg:String){
    
    
        AlertMessage.alertMessageController = UIAlertController(title: titleMessage, message:
            alertMsg, preferredStyle: UIAlertControllerStyle.Alert)
    
        AlertMessage.alertMessageController.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default,handler: nil))
        if let controller = UIApplication.sharedApplication().keyWindow?.rootViewController?.presentedViewController {
            controller.presentViewController(AlertMessage.alertMessageController, animated: true, completion: nil)
        }
        else{
            UIApplication.sharedApplication().delegate?.window!!.rootViewController?.presentViewController(AlertMessage.alertMessageController, animated: true, completion: nil)
        }
    
        return
    
     }
    }
    
    0 讨论(0)
提交回复
热议问题