Как я могу реализовать пользовательский UIAlertview с индикатором выполнения и кнопкой отмены? - PullRequest
2 голосов
/ 01 ноября 2009

Привет, разработчики приложений для iPhone,

Я занимаюсь разработкой приложения для iPhone. Это приложение позволяет пользователю загружать изображения на мой сервер. Я хочу показать прогресс загрузки в alertView. Мне нужен пример кода, чтобы проиллюстрировать, как реализовать пользовательский UIAlertView с индикатором выполнения.

Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 01 ноября 2009

«Быстрый» способ сделать это - взять UIAlertView и переместить его внутренние подпредставления, чтобы вставить в него свой индикатор выполнения. Недостатком этого является то, что он хрупок и может сломаться в будущем.

Правильный способ сделать это требует реализации подкласса UIWindow, который выложен так, как вы хотите, и установите для его windowLevel значение UIWindowLevelAlert, чтобы он рисовал перед вашим текущим окном. Должно быть довольно легко заставить что-то работать, но чтобы заставить его выглядеть как одно из встроенных предупреждений, потребуется много усилий.

Прежде чем вы сделаете что-либо из этого, я бы посоветовал вам пересмотреть свой пользовательский интерфейс. Почему ваше приложение должно блокироваться во время загрузки. Почему бы просто не разместить строку состояния где-нибудь на экране и позволить пользователю продолжать взаимодействовать с приложением, пока вы выполняете загрузку асинхронно. Посмотрите, как работает приложение «Сообщения», когда оно загружает MMS, чтобы понять, о чем я говорю.

Пользователи ненавидят, когда приложение блокирует их, когда что-то происходит, особенно на iPhone, где нет многозадачности.

3 голосов
/ 20 января 2010

Я знаю, что вы спрашиваете об этом в предупреждении, но вы можете оформить заказ http://github.com/matej/MBProgressHUD

0 голосов
/ 11 апреля 2013

Вы можете создать подкласс UIAlertView. Я сделал что-то вроде этого, измените это для своей необходимости.

Заголовочный файл,

#import <Foundation/Foundation.h>

/* An alert view with a textfield to input text.  */
@interface AlertPrompt : UIAlertView    
{
    UITextField *textField;
}

@property (nonatomic, retain) UITextField *textField;
@property (readonly) NSString *enteredText;

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle okButtonTitle:(NSString *)okButtonTitle;

@end

Исходный код,

#import "AlertPrompt.h"


@implementation AlertPrompt

static const float kTextFieldHeight     = 25.0;
static const float kTextFieldWidth      = 100.0;

@synthesize textField;
@synthesize enteredText;

- (void) drawRect:(CGRect)rect {
    [super drawRect:rect];

    CGRect labelFrame;
    NSArray *views = [self subviews];
    for (UIView *view in views){
        if ([view isKindOfClass:[UILabel class]]) {
            labelFrame = view.frame;
        } else {    
            view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y + kTextFieldHeight , view.frame.size.width, view.frame.size.height);
        }

    }

    CGRect myFrame = self.frame;
    self.textField.frame = CGRectMake(95, labelFrame.origin.y+labelFrame.size.height + 5.0, kTextFieldWidth, kTextFieldHeight);
    self.frame = CGRectMake(myFrame.origin.x, myFrame.origin.y, myFrame.size.width, myFrame.size.height + kTextFieldHeight);

}

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle okButtonTitle:(NSString *)okayButtonTitle
{

    if (self = [super initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:okayButtonTitle, nil])
    {
        // add the text field here, so that customizable from outside. But set the frame in drawRect. 
        self.textField = [[UITextField alloc] init];
        [self.textField setBackgroundColor:[UIColor whiteColor]]; 
        [self addSubview: self.textField];

       // CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 20.0); 
      //  [self setTransform:translate];
    }
    return self;
}
- (void)show
{
    [textField becomeFirstResponder];
    [super show];
}
- (NSString *)enteredText
{
    return textField.text;
}
- (void)dealloc
{
    [textField release];
    [super dealloc];
}
@end
...