Как добавить subview внутри UIAlertView для iOS 7?

У меня есть приложение в магазине iTunes, которое отображает некоторые UILabel и UIWebView на UIAlertView. Согласно сеансовому видео, addSubView для UIAlertView не будет работать. Они говорили о ContentView. Но в SDK GM Seeds я не смог найти это свойство, и, похоже, нет другого пути.

Единственное, что я могу сделать, это создать пользовательский подкласс UIView и заставить его работать как UIAertView. Можете ли вы предложить любое другое простое решение?

Спасибо за помощь.

Ответ 1

Вы действительно можете изменить аксессуар в customContentView в iOS7 (и, похоже, в iOS8) UIAlertView

[alertView setValue:customContentView forKey:@"accessoryView"];

Попробуйте этот код:

UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"TEST" message:@"subview" delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil];
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 80, 40)];
[av setValue:v forKey:@"accessoryView"];
v.backgroundColor = [UIColor yellowColor];
[av show];

Помните, что перед вызовом [alertView show]

необходимо установить пользовательский аксессуар.

enter image description here

Ответ 2

AddSubview невозможно из iOS 7.

Единственный способ - создать пользовательский подкласс UIView, который может работать как UIAlertView. Я мог найти несколько компонентов на Github.

Связанный Custom Alert, похоже, работает хорошо. Поместив надлежащую проверку версии, вы можете определить, как перейти на собственный UIAlertView или CustomAlertView.

Ответ 3

Добавление subview к UIAlertView в iOS7 отличается от предыдущих версий iOS. Попробуйте что-то вроде этого:

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    [myAlertView setValue:myCustomView forKey:@"accessoryView"]; //works only in iOS7
} else {
    myAlertView.message = @"\n"; //or just add \n to the end of the message (it a workaround to create space inside the alert view
    [myAlertView addSubview:myCustomView];
}

[myAlertView show]; //show the alert AFTER CUSTOMIZATION  

Ответ 4

Подумайте, вы также получите помощь, если вы его используете:)

syncProgressBarView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault];
syncProgressBarView.frame =CGRectMake(20, 55, 250, 20);
[syncProgressBarView setProgress:0.0f animated:NO];
syncProgressBarView.backgroundColor =[UIColor clearColor];
[progressView addSubview:syncProgressBarView];

Создание нового представления для суб-просмотра UIProgressView

progressView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, DeviceWidth, 100)];
[[UIApplication sharedApplication].keyWindow addSubview:progressView];
progressView.backgroundColor = [UIColor clearColor];
progressView.center = [UIApplication sharedApplication].keyWindow.center;
syncProgressBarView.frame = CGRectMake(progressView.frame.size.width/2 - 250/2, progressView.frame.size.height/2 - 10, 250, 20);
[[UIApplication sharedApplication].keyWindow bringSubviewToFront:[progressView superview]];

Еще одна вещь, которую вы должны сделать...

dispatch_async(dispatch_get_main_queue(), ^{
                [self updateProgressBar];
            });

Ответ 5

Пользовательский вид предупреждения в github, связанный с принятым ответом, замечательный. Однако вы не можете запустить это непосредственно из метода viewdidload. Закрывающий UIView прикреплен к первому окну приложения, поэтому вам нужно подождать сплит-секунд. Я добавил этот код в viewdidload, который я нашел как закрытый вопрос.

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
      // Open the dialog here
   });

Ответ 6

Решение заключается в подклассе UIAlertView и обнаружении "_UIModalItemAlertContentView". У моего AlertView был UITextField, поэтому я использовал его для обнаружения содержимого:

- (void)show
{
    [ super show ];
    UIView *contentView=nil;
    if([[[UIDevice currentDevice] systemVersion] floatValue ] < 7.0f)
    {
        contentView=self;
    } else {
        UIView *rootView=[self textFieldAtIndex:0];
        while((rootView=[rootView superview])!=nil)
        {
            if([ NSStringFromClass([rootView class]) isEqualToString:@"_UIModalItemAlertContentView"])
            {
                contentView=rootView;
                break;
            }
        }
    }

    if(contentView!=nil)
    {
        [ contentView addSubview: ... ];
    }
}