次のアラート方法があります。
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)
}
animated
メソッドに余分な引数presentViewController
があるというエラーが表示されますが、それを取り出してもエラーは消えません。 completion
は追加の引数です。
presentViewController
は、Swift 3のように変更されました。
present(alert, animated: true)
詳細については、 Apple Documentation を確認してください。
From Swift 3 completion
はオプションなので、完了ブロックを処理したくない場合はnil
を記述する必要はなく、完了ブロックを処理したい場合はこのように書きます。
self.present(alert, animated: true) {
}
注:notifyUserメソッドはstatic
で宣言されているため、self
を使用できないため、削除することも削除しますこのエラーを修正した後に表示される次のエラー。
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)
スイフト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)
静的メソッドでselfを使用しようとしていますが、selfはそのクラスの現在のインスタンスでなければなりませんが、staticはselfを使用できません。
アラートボタンのアクションハンドラなし
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.
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)
}
アラートボタンのアクションハンドラーを使用
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.
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
は、このアラートを表示するコントローラーです
Swift試すカスタムアクションキャンセル
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)
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)