Добавление индикатора активности в UIAlertView

Я пытаюсь добавить UIActivityIndicatorView к UIAlertView, но не могу этого сделать. Я видел сообщения об этой реализации и обнаружил, что она работает только для версий ниже iOS7.

Ниже приведен код, который я пробовал...

var alert: UIAlertView = UIAlertView(title: "Title", message: "Please wait...", delegate: nil, cancelButtonTitle: "Cancel");

var loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(0.0, 0.0, 10.0, 10.0)) as UIActivityIndicatorView
loadingIndicator.center = self.view.center;
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
loadingIndicator.startAnimating();

alert.addSubview(loadingIndicator);  
alert.show();

Есть ли что-то конкретное, что нужно сделать для iOS7 и выше, чтобы это сделать?


person Srujan Simha    schedule 18.12.2014    source источник
comment
Вас также может заинтересовать этот класс: github.com/goktugyil/CozyLoadingActivity   -  person Esqarrouth    schedule 04.06.2015


Ответы (4)


попробуй этот код!!

var alert: UIAlertView = UIAlertView(title: "Title", message: "Please wait...", delegate: nil, cancelButtonTitle: "Cancel")


var loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRect(x: 50, y: 10, width: 37, height: 37)) as UIActivityIndicatorView
loadingIndicator.center = self.view.center
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
loadingIndicator.startAnimating();

alert.setValue(loadingIndicator, forKey: "accessoryView")
loadingIndicator.startAnimating()

alert.show();

Надеюсь, я помог тебе

person Beslan Tularov    schedule 18.12.2014
comment
очень короткое, очень хорошее решение без рекомендации использовать стручок. вы заслуживаете особого места на небесах. - person Jochen Österreicher; 09.01.2017
comment
использует старые методы/API, поэтому этот код не работает со Swift 5 + UIAlertView устарел в iOS 9.0 - person falsecrypt; 25.07.2019
comment
setValue:forUndefinedKey - Немедленный сбой. - person dub; 29.04.2021

Для Swift 4 Создайте расширение контроллера предупреждений.

extension UIAlertController {

    private struct ActivityIndicatorData {
        static var activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
    }

    func addActivityIndicator() {
        let vc = UIViewController()
        vc.preferredContentSize = CGSize(width: 40,height: 40)
        ActivityIndicatorData.activityIndicator.color = UIColor.blue
        ActivityIndicatorData.activityIndicator.startAnimating()
        vc.view.addSubview(ActivityIndicatorData.activityIndicator)
        self.setValue(vc, forKey: "contentViewController")
    }

    func dismissActivityIndicator() {
        ActivityIndicatorData.activityIndicator.stopAnimating()
        self.dismiss(animated: false)
    }
}

Создайте Var и ctivityIndicatorAlert в контроллере представления и напишите методы display и dismiss в контроллере представления, как показано ниже.

var activityIndicatorAlert: UIAlertController?

func displayActivityIndicatorAlert() {
    activityIndicatorAlert = UIAlertController(title: NSLocalizedString("Loading", comment: ""), message: NSLocalizedString("PleaseWait", comment: "") + "...", preferredStyle:  UIAlertController.Style.alert)
    activityIndicatorAlert!.addActivityIndicator()
    var topController:UIViewController = UIApplication.shared.keyWindow!.rootViewController!
    while ((topController.presentedViewController) != nil) {
        topController = topController.presentedViewController!
    }
    topController.present(activityIndicatorAlert!, animated:true, completion:nil)
}

func dismissActivityIndicatorAlert() {
    activityIndicatorAlert!.dismissActivityIndicator()
    activityIndicatorAlert = nil
}

Вы также можете добавить расширение UIViewcontroller для глобально доступных выше всех методов.

extension UIViewController {
    private struct activityAlert {
        static var activityIndicatorAlert: UIAlertController?
    }
    //completion : ((Int, String) -> Void)?)
    func displayIPActivityAlert(_ onCancel : (()-> Void)?) {
        activityAlert.activityIndicatorAlert = UIAlertController(title: NSLocalizedString("Loading...", comment: ""), message: nil , preferredStyle: UIAlertController.Style.alert)
        activityAlert.activityIndicatorAlert!.addActivityIndicator()
        var topController:UIViewController = UIApplication.shared.keyWindow!.rootViewController!
        while ((topController.presentedViewController) != nil) {
            topController = topController.presentedViewController!
        }

        activityAlert.activityIndicatorAlert!.addAction(UIAlertAction.init(title:NSLocalizedString("Cancel", comment: ""), style: .default, handler: { (UIAlertAction) in
                self.dismissIPActivityAlert()
                onCancel?()
        }))
        topController.present(activityAlert.activityIndicatorAlert!, animated:true, completion:nil)
    }

    func dismissIPActivityAlert() {
        activityAlert.activityIndicatorAlert!.dismissActivityIndicator()
        activityAlert.activityIndicatorAlert = nil
    }
}
person Pak Ho Cheung    schedule 12.03.2018
comment
Этот ответ идеален! - person Mike Koene; 21.11.2018

Для тех, кто использует Objective-C. Мое решение оборачивает UIActivityIndicatorView большим видом, поэтому поле до края UIAlertView не такое уж маленькое.

#import "UIAlertView+ActivityIndicator.h"

@implementation UIAlertView (ActivityIndicator)

+ (UIAlertView *)alertViewWithActivityIndicator:(NSString *)title delegate:(id<UIAlertViewDelegate>)delegate;
{
    UIAlertView *a = [[UIAlertView alloc] initWithTitle:title
                                                message:nil
                                               delegate:delegate
                                      cancelButtonTitle:nil
                                      otherButtonTitles:nil];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    aiv.translatesAutoresizingMaskIntoConstraints = NO;
    [v addSubview:aiv];
    [v addConstraint:[NSLayoutConstraint constraintWithItem:aiv
                                                  attribute:NSLayoutAttributeCenterX
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:v
                                                  attribute:NSLayoutAttributeCenterX
                                                 multiplier:1.0
                                                   constant:0]];
    [v addConstraint:[NSLayoutConstraint constraintWithItem:aiv
                                                  attribute:NSLayoutAttributeCenterY
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:v
                                                  attribute:NSLayoutAttributeCenterY
                                                 multiplier:1.0
                                                   constant:0]];
    [aiv startAnimating];
    [a setValue:v forKey:@"accessoryView"];

    return a;
}

@end
person Johannes    schedule 21.03.2015

Принятый ответ в Swift 3:

var alert: UIAlertView = UIAlertView(title: "Title", message: "Please wait...", delegate: nil, cancelButtonTitle: "Cancel");


    let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x:50, y:10, width:37, height:37))
    loadingIndicator.center = self.view.center;
    loadingIndicator.hidesWhenStopped = true
    loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
    loadingIndicator.startAnimating();

    alert.setValue(loadingIndicator, forKey: "accessoryView")
    loadingIndicator.startAnimating()

    alert.show();
person Jochen Österreicher    schedule 09.01.2017
comment
UIAlertView устарел в iOS 9.0 - person cmii; 03.07.2017