首页 文章

UIAlertController不使用Swift 3.0

提问于
浏览
18

我有以下警报方法 .

static func notifyUser(_ title: String, message: String) -> Void
{
    let alert = UIAlertController(title: title,
                                  message: message,
                                  preferredStyle: UIAlertControllerStyle.alert)

    let cancelAction = UIAlertAction(title: "OK",
                                     style: .cancel, handler: nil)

    alert.addAction(cancelAction)
    self.presentViewController(alert, animated: true, completion: nil)
}

我收到一个错误,说 presentViewController 方法中有一个额外的参数 animated ,但当我把它取出时,它仍然没有't dismiss the error, and then I' m告诉 completion 是一个额外的参数 .

6 回答

  • 27

    像这样在Swift 3中更改了 presentViewController .

    present(alert, animated: true)
    

    有关详细信息,请查看Apple Documentation .

    从Swift 3 completion 是可选的,所以如果你不想处理完成块,则不需要为此编写 nil ,如果你想处理完成块,那么这样写 .

    self.present(alert, animated: true) { 
    
    }
    

    Note: 您的notifyUser方法是使用 static 声明的,因此您不能使用 self ,因此请删除它以删除更正此错误后得到的下一个错误 .

  • 11
    let actionSheetController: UIAlertController = UIAlertController(title: "Action Sheet", message: "Swiftly Now! Choose an option!", preferredStyle: .alert)
     let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .cancel) { action -> Void in
                //Just dismiss the action sheet
            }
     actionSheetController.addAction(cancelAction)
     self.present(actionSheetController, animated: true, completion: nil)
    
  • 4

    斯威夫特3

    let alertView = UIAlertController(title: "", message: "your message", preferredStyle: .alert)
    let action = UIAlertAction(title: "OK", style: .default, handler: { (alert) in
    
    })
    alertView.addAction(action)
    self.present(alertView, animated: true, completion: nil)
    
  • 2

    您试图在静态方法中使用self,而self应该是该类的当前实例,但static不能使用self .

    Without Action Handler For Alert Button

    In Obj-C

    +(void) notifyUser:(NSString *)title withMessage:(NSString *)message onViewController:(UIViewController *)vc {
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:nil];
        [alert addAction:action];
        //vc will be the view controller on which you will present your alert as you cannot use self because this method is static.
        [vc presentViewController:alert animated:true completion:nil];
    }
    

    In Swift 3.0

    static func notifyUser(_ title: String, message: String, vc: UIViewController) -> Void
        {
            let alert = UIAlertController(title: title,
                                          message: message,
                                          preferredStyle: UIAlertControllerStyle.alert)
    
            let cancelAction = UIAlertAction(title: "OK",
                                             style: .cancel, handler: nil)
    
            alert.addAction(cancelAction)
            //vc will be the view controller on which you will present your alert as you cannot use self because this method is static.
            vc.present(alert, animated: true, completion: nil)
        }
    

    With Action Handler For Alert Button

    In Obj-C

    +(void) notifyUser:(NSString *)title withMessage:(NSString *)message withButtonTitles:(NSArray<NSString *> *)buttonTitles andButtonStyles:(NSArray *)styles onViewController:(UIViewController *)vc onCompletion:(void (^)(NSInteger))completion  {
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
    
        for (NSString *title in buttonTitles) {
            UIAlertActionStyle style = [[styles objectAtIndex:[buttonTitles indexOfObject:title]] intValue];
    
            UIAlertAction *actionObj = [UIAlertAction actionWithTitle:title style:style handler:^(UIAlertAction *action){
                NSInteger index = [buttonTitles indexOfObject:action.title];
                completion(index);
            }];
            [alert addAction:actionObj];
        }
        //vc will be the view controller on which you will present your alert as you cannot use self because this method is static.
        [vc presentViewController:alert animated:true completion:nil];
    }
    

    像这样调用上面的实例方法 .

    [ClassName notifyUser:@"Title For Alert" withMessage:@"Message for Alert" withButtonTitles:@[@"Camera",@"Library",@"Dismiss"] andButtonStyles:@[@(UIAlertActionStyleDefault),@(UIAlertActionStyleDefault),@(UIAlertActionStyleCancel)] onViewController:yourViewController onCompletion:^(NSInteger indexOfTappedButton){
                        //Note the index of the button will have the same order as you have provide the titles array in this method
        }];
    

    此处,yourViewController是您将在其上显示此警报的控制器

    In Swift 3.0

    extension UIAlertController {
        static func notifyUser(_ title: String, message: String, alertButtonTitles: [String], alertButtonStyles: [UIAlertActionStyle], vc: UIViewController, completion: @escaping (Int)->Void) -> Void
        {
            let alert = UIAlertController(title: title,
                                          message: message,
                                          preferredStyle: UIAlertControllerStyle.alert)
    
            for title in alertButtonTitles {
                let actionObj = UIAlertAction(title: title,
                                              style: alertButtonStyles[alertButtonTitles.index(of: title)!], handler: { action in
                                                completion(alertButtonTitles.index(of: action.title!)!)
                })
    
                alert.addAction(actionObj)
            }
    
    
            //vc will be the view controller on which you will present your alert as you cannot use self because this method is static.
            vc.present(alert, animated: true, completion: nil)
        }
    }
    

    像这样调用上面的静态方法 .

    UIAlertController.notifyUser("Title for Alert", message: "Message show in Alert", alertButtonTitles: ["Camera", "Library","Dismiss"], alertButtonStyles: [.default,.default,.cancel], vc: yourViewController, completion: { indexOfTappedButton in
                //Note the index of the button will have the same order as you have provide the titles array in this method
            })
    

    此处,yourViewController是您将在其上显示此警报的控制器

  • 27

    Swift 3 尝试 Custom 操作取消

    let uiAlertController = UIAlertController(// create new instance alert  controller
              title: "You TITLE text",
              message: "You Message text", 
              preferredStyle:.alert)
    
        uiAlertController.addAction(// add Custom action on Event is Cancel
        UIAlertAction.init(title: "Cancel", style: .default, handler: { (UIAlertAction) in
           //TO DO code
           uiAlertController.dismiss(animated: true, completion: nil)//dismiss show You alert, on click is Cancel
        }))
        //show You alert
        self.present(uiAlertController, animated: true, completion: nil)
    
  • 0
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    if action {
        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: {
            (action : UIAlertAction!) in self.navigationController?.popViewController(animated: true)
        }))
    } else {
        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
    }
    self.present(alert, animated: true, completion: nil)
    

相关问题