5

UIAlertView 在 ios 6 中运行良好,代码如下。但是当涉及到 ios 7 时,子视图(我的代码中的“是”和“否”按钮)在调用 alertview 时没有显示,只显示文本消息。谁能告诉我如何解决这个问题?

viewController.m 文件

 [Utilities prCustomAlert:@"Textmessage" inTitle:@"Alert view title" delegate:self inTag:300];
 CustomAlertView *alertView    = [Utilities sharedUtility].customAlertView;
alertView.numberOfBtns  = 2;
UIButton *btn= (UIButton *)[alertView viewWithTag:10];
[btn setTitle:@"no" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(dontlogout) forControlEvents:UIControlEventTouchDown];

btn = (UIButton *)[alertView viewWithTag:11];
[btn setTitle:@"yes" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(logout) forControlEvents:UIControlEventTouchDown];    
[Utilities displayCustomAlertForDelegate:self];

UIAlertView.m 文件

  CGRect viewFrame    = self.frame;
  CGRect buttonFrame  = button.frame;
  if(self.numberOfBtns==2){

  CGRect labelFrame   = [self viewWithTag:15].frame;        
  button.frame    = CGRectMake(10, 0, 40, 30);
        button.hidden   = NO;

        //yes...
        btn          = (UIButton *)[self viewWithTag:11];       
        btn.frame    = CGRectMake(60, 0, 40, 30);
        btn.hidden   = NO;

        //no..    
        btn          = (UIButton *)[self viewWithTag:10];
        btn.hidden   = YES;


  }
4

3 回答 3

1

我认为iOS7中问题的根源在于Apple改变了UIAlertView的外观机制。从现在开始,在启动两个私有视图控制器之后,alertView 的任何显示都将跟随

_UIModalItemAppViewController
_UIModalItemsPresentingViewController

换句话说,现在 UIAlertView 不是一个纯粹的视图——它是一些复杂的视图控制器集合的一部分,具有完整的视图控制器生命周期。

但是一个好消息是您可以在标准警报视图中将附件视图更改为您的customContentView

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

请注意,您必须在[alertView show]之前调用它。

于 2014-01-11T19:58:05.150 回答
1

当 UIAlertView 出现时,我们可以通过将 subview 添加到 presentViewController 的视图来将子视图添加到 UIAlerView。我已经像以下方式访问了 UIAlertView :

NSArray *subviews = [UIApplication sharedApplication].keyWindow.rootViewController.presentedViewController.view.subviews;

我创建了 UIAlerView 的子类:

头文件:

@interface MLKLoadingAlertView : UIAlertView

- (id)initWithTitle:(NSString *)title;

@end

实施文件:

#import "MLKLoadingAlertView.h"

#define ACTIVITY_INDICATOR_CENTER   CGPointMake(130, 90)

@implementation MLKLoadingAlertView

- (id)initWithTitle:(NSString *)title
{
    if ( self = [super init] )
    {
        self.title = title;
        self.message = @"\n\n";

        [self setDelegate:self];
    }

    return self;
}

// You can Customise this based on your requirement by adding subviews.
- (void)didPresentAlertView:(UIAlertView *)alertView
{
    NSArray *subviews = [UIApplication sharedApplication].keyWindow.rootViewController.presentedViewController.view.subviews;

    if( subviews.count > 1 )
    {
        // iOS while presenting an alertview uses a presening view controller. That controller's view has several subviews. I have picked one
        // subview from it which has frame similar to the alertview frame.
        UIView *presentedView = [subviews objectAtIndex:1];

         UIActivityIndicatorView *customActivityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        [customActivityIndicator startAnimating];
        customActivityIndicator.center = ACTIVITY_INDICATOR_CENTER;

        [presentedView addSubview:customActivityIndicator];
    }
}

@end

在 - (void)didPresentAlertView:(UIAlertView *)alertView 方法中,我通过访问呈现视图控制器的视图将子视图添加到 UIAlertView。

你可以在这里找到解释和代码示例

于 2014-01-23T12:08:31.430 回答
1

你所做的总是错的。不允许将自己的子视图添加到 UIAlertView。好消息是 - 在 iOS 7 中,您不必这样做!新的自定义过渡动画机制让您可以创建自己的视图,该视图的行为只是一个警报视图,但由于它是您的视图,您可以将任何您喜欢的内容放入其中,如下所示:

在此处输入图像描述

请注意,假的“警报视图”如何漂浮在右侧屏幕截图中的原始视图前面,并使其后面的屏幕变暗,就像真正的警报视图一样。但它完全由自定义内容组成;“真实”的警报视图永远不能包含图像和开关!

有关创建此视图的代码,您可以轻松地适应自己的目的,请参阅我的 github 站点:https ://github.com/mattneub/custom-alert-view-iOS7

于 2014-01-11T20:04:56.033 回答