22

我在 iTunes 商店中有一个应用程序,它显示一些UILabelUIWebView. UIAlertView根据会话视频,addSubViewforUIAlertView将不起作用。他们谈过ContentView。但在 GM Seeds SDK 中,我找不到该属性,似乎没有其他方法。

我唯一能做的就是创建一个自定义子类UIView并让它像UIAertView. 你能建议任何其他简单的解决方案吗?

谢谢您的帮助。

4

6 回答 6

103

你真的可以在 iOS7 中将accessoryView更改为customContentView(而且似乎在 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]之前设置自定义附件视图

在此处输入图像描述

于 2014-01-11T20:25:11.010 回答
10

从 iOS 7 开始,AddSubview 是不可能的。

唯一的方法是创建一个可以充当 UIAlertView 的自定义 UIView 子类。我可以在 Github 上找到一些组件。

链接的一个自定义警报似乎运作良好。通过进行适当的版本检查,可以识别出使用本机 UIAlertView 或 CustomAlertView。

于 2013-09-25T11:50:56.183 回答
3

UIAlertView在 iOS7 中向 an 添加子视图与早期的 iO​​S 版本不同。尝试这样的事情:

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's a workaround to create space inside the alert view
    [myAlertView addSubview:myCustomView];
}

[myAlertView show]; //show the alert AFTER CUSTOMIZATION  
于 2014-03-21T09:39:43.343 回答
-1

认为如果你使用它你也会得到帮助:)

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];
            });
于 2013-10-30T05:32:55.290 回答
-2

已接受答案中链接的 github 上的自定义警报视图很棒。但是,您不能直接从 viewdidload 方法启动它。封闭的 UIView 附加到应用程序的第一个窗口,因此您必须等待片刻。我将此代码添加到 viewdidload 中,我发现这是一个已解决的问题。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
      // Open the dialog here
   });
于 2014-09-16T16:14:23.067 回答
-9

一个解决方案是继承 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: ... ];
    }
}
于 2014-01-11T12:33:44.207 回答