web-dev-qa-db-ja.com

グローバルでuialertcontrollerを作成する方法swift

次のようにConfig.Swiftファイルにuialertcontrollerを作成しようとしています。

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

問題は、self.window!.で問題を見つけたことです

タイプ「Config」にはメンバー「window」がありません

その問題を解決する方法を教えてください。

8
PPShein

_self.window_は、このクラスにwindowオブジェクトがあることを意味しますが、そうではありません。

_let window : UIWindow?_をwindow?.presentViewController(alert, animated: true, completion: nil)と一緒に使用する必要がありますが、このウィンドウは実際には既存のウィンドウを表しておらず、とにかくビューコントローラではないため、これは役に立ちません。

したがって、使用する実際のViewControllerをメソッドに渡すことをお勧めします。

_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)
}
_

uIViewControllerオブジェクトが使用可能なクラスから呼び出します。

17
ayaio

スイフト

これが私が使用したものです。これは@penathebossが回答したものと同じですが、アクションとハンドラーを追加する機能を追加するだけです。

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)
    }
}

actionTitlesactionsの配列が同じ数であることを確認してください。パスnilアクションハンドラーのクロージャーが必要ない場合。

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

},{action2 in

}, nil])

Objective C

UIViewControllerのカテゴリを追加します

IViewController + PopAlert.h

#import <UIKit/UIKit.h>

@interface UIViewController (UIViewControllerCategory)
- (void) popAlertWithTitle: (NSString*) title message: (NSString*) message actionTitles:(NSArray *) actionTitles actions:(NSArray*)actions;
@end

IViewController + 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

使用法

#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];
29
William Hu

拡張機能を作成することをお勧めします。

extension UIViewController {
    func showAlertMessage(titleStr:String, messageStr:String) {
        let alert = UIAlertController(title: titleStr, message: messageStr, preferredStyle: UIAlertControllerStyle.Alert)
       self.presentViewController(alert, animated: true, completion: nil)
    }
}
2
Pranav Wadhwa

これを試すことができます。AppDelegate.Swiftファイルに以下のコードを追加してください。

 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)

    }

そして、任意のビューコントローラからshowAlertViewメソッドを呼び出します

AppDelegate.showAlertView(vc: self, titleString: "testTitle", messageString: "test msg")
2
Sunil aruru

以下のGITの例を参照してください

https://github.com/amilaim/CommonAlertView

//  ViewController.Swift
//  CommonAlertView
//
//  Created by Amila Munasinghe on 4/25/17.
//  Copyright © 2017 Developer Insight. All rights reserved.
//
import UIKit

class ViewController: UIViewController,AlertViewControllerDelegate {

@IBOutlet weak var AlertViewResultTextOutlet: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

@IBAction func ShowAlertAction(_ sender: Any) {

    let alert = AlertViewController.sharedInstance
    alert.delegate = self
    alert.SubmitAlertView(viewController: self,title: "Developer Insight", message: "Please enter any text value")

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func SubmitAlertViewResult(textValue : String) {

    AlertViewResultTextOutlet.text = textValue

 } 
}

一般的なUIAlertViewControllerの実装

import UIKit

protocol AlertViewControllerDelegate {
func SubmitAlertViewResult(textValue : String)
 }

class AlertViewController {

static let sharedInstance = AlertViewController()

private init(){}

var delegate : AlertViewControllerDelegate?

func SubmitAlertView(viewController : UIViewController,title : String, message : String){

    let alert = UIAlertController(title: title,
                                  message: message,
                                  preferredStyle: .alert)

    // Submit button
    let submitAction = UIAlertAction(title: "Submit", style: .default, handler: { (action) -> Void in
        // Get 1st TextField's text
        let textField = alert.textFields![0]

        if(textField.text != "")
        {
            self.delegate?.SubmitAlertViewResult(textValue: textField.text!)
        }

    })

    // Cancel button
    let cancel = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action) -> Void in })


    // Add 1 textField and cutomize it
    alert.addTextField { (textField: UITextField) in
        textField.keyboardAppearance = .dark
        textField.keyboardType = .default
        textField.autocorrectionType = .default
        textField.placeholder = "enter any text value"
        textField.clearButtonMode = .whileEditing

    }

    // Add action buttons and present the Alert
    alert.addAction(submitAction)
    alert.addAction(cancel)
    viewController.present(alert, animated: true, completion: nil)

 }

}
1

AlerMessageクラスを作成しました。アプリケーションのどこからでも呼び出すことができます。

//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

 }
}
1

Swift4のShowAlert用に作成された私のユーティリティクラスを使用できます。 1行のコードを書くだけで非常に使いやすくなります。

シンプルアラートを表示

@IBAction func showDefaultAlert(_ sender: Any) {

  Alert.showAlert(title:"Alert", message:"Default Alert")

}

デモコードリンク:https://github.com/smindia1988/EasyAlertInSwift4

1

@William Huによるソリューションに基づいて私が使用しているもの:

func popup(caller:UIViewController, style:UIAlertControllerStyle? = UIAlertControllerStyle.alert,
        title:String, message:String, buttonTexts:[String], buttonStyles:([UIAlertActionStyle?])? = nil,
        handlers:[((UIAlertAction) -> Void)?], animated:Bool? = nil, completion: (() -> Void)? = nil) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: style!)
    for i in 0..<buttonTexts.count {
        alert.addAction(UIAlertAction(title: buttonTexts[i],
            style: (buttonStyles == nil || i >= buttonStyles!.count || buttonStyles![i] == nil ?
                UIAlertActionStyle.default : buttonStyles![i]!),
            handler: (i >= handlers.count || handlers[i] == nil ? nil : handlers[i]!)))
    }
    caller.present(alert, animated: animated != nil ? animated! : true, completion: completion)
}
  1. 単一の関数はデフォルトでAlertを提供し、オプションでActionSheetに使用できます。
  2. 配列buttonTextsbuttonStyles、およびhandlersは、要件に応じてサイズが等しくない場合があります。
  3. Actionsはスタイルを設定できます。
  4. Animatedを指定できます。
  5. オプションのblockは、プレゼンテーションが終了したときに実行されるように指定できます。

使用法:

popup(caller: self, style: UIAlertControllerStyle.alert,
        title: "Title", message: "Message",
        buttonTexts: ["Destructive", "Cancel", "OK"],
        buttonStyles: [UIAlertActionStyle.destructive, UIAlertActionStyle.cancel],
        handlers: [nil], animated: false)
1
Kanchu

このコードを書くことをお勧めしますが、本当に必要な場合は、これを試してください。

static func showAlertMessage(titleStr:String, messageStr:String) -> Void {
    let alert = UIAlertController(title: titleStr, message: messageStr, preferredStyle: UIAlertControllerStyle.Alert);
    if let viewController = UIApplication.sharedApplication().windows.first?.rootViewController as UIViewController? {
        viewController.presentViewController(alert, animated: true, completion: nil)
    }
}

少なくとも故障することはありません。

@エリックDより良い答え。

0
maquannene

これは、使用可能なViewControllerの上に表示できる方法でもあります。

UIApplication.topViewController()?.present(alertViewController!, animated: true, completion: nil)

0
Mehul Chuahan

AppDelegateウィンドウからプレゼンテーションを行う場合は、次のように使用できます

UIApplication.sharedApplication().delegate?.window.rootViewController?.presentViewController(vc, animated: true, completion: nil)
0
Rahul