UIAlertView 在 ios 6 中工作正常,代码如下。但是当涉及到 ios 7 时,子视图(我的代码中的“是”和“否”按钮)在调用警报视图时不会显示,仅显示文本消息。谁能告诉我我该如何解决这个问题?
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;
}
当呈现 UIAlertView 时,我们可以通过将子视图添加到presentedViewController 的视图来向 UIAlerView 添加子视图。我已经像以下方式访问了 UIAlertView :
NSArray *subviews = [UIApplication共享应用程序].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 中。
您可以在 Here
找到相关说明和代码示例你所做的事情总是错的。不允许您将自己的子视图添加到 UIAlertView。好消息是 - 在 iOS 7 中,您不必这样做!新的自定义过渡动画机制允许您创建自己的视图,其行为只是一个警报视图,但由于它是您的视图,因此您可以将任何您喜欢的内容放入其中,如下所示:
请注意,假“警报视图”如何漂浮在右侧屏幕截图中的原始视图前面,并使后面的屏幕变暗,就像真正的警报视图一样。但它完全由自定义内容组成; “真正的”警报视图永远不可能包含图像和开关!
有关创建此视图的代码(您可以轻松地适应自己的目的),请参阅我的 github 站点:https://github.com/mattneub/custom-alert-view-iOS7
我认为iOS7中问题的根源是苹果改变了UIAlertView的外观机制。 从现在开始,在启动两个私有视图控制器后,所有的alertView都会随之显示
_UIModalItemAppViewController
_UIModalItemsPresentingViewController
换句话说,现在 UIAlertView 不是一个纯粹的视图 - 它是具有完整视图控制器生命周期的一些复杂视图控制器集合的一部分。
但是一个好消息是您可以在标准警报视图中将 accessoryView 更改为您的 customContentView
[alertView setValue:customContentView forKey:@"accessoryView"];
请注意,您必须在[alertView show]之前调用此方法。