You are trying to use self in a static method while self should be the current instance of that class but static cannot use 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];
}
Invoke above instance method like this.
[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
}];
Here yourViewController
is the controller on which you will present this Alert
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)
}
}
Invoke above static method like this.
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
})
Here yourViewController
is the controller on which you will present this Alert