通过layoutSubviews => UIAlertButton类未find自定义UIAlertButton

我试图使用本教程实现自定义警报视图。 所有在这个啧啧啧啧啧啧啧啧啧啧啧but but的,但它并没有谈到定制UIAlertButton 然后,我试图通过layoutSubviews方法来定制它:

- (void)layoutSubviews { for (UIView *subview in self.subviews){ //Fast Enumeration if ([subview isMemberOfClass:[UIImageView class]]) { subview.hidden = YES; //Hide UIImageView Containing Blue Background } if ([subview isMemberOfClass:[UILabel class]]) { //Point to UILabels To Change Text UILabel *label = (UILabel*)subview; //Cast From UIView to UILabel label.textColor = [UIColor colorWithRed:210.0f/255.0f green:210.0f/255.0f blue:210.0f/255.0f alpha:1.0f]; label.shadowColor = [UIColor blackColor]; label.shadowOffset = CGSizeMake(0.0f, 1.0f); } if ([subview isMemberOfClass:[UIAlertButton class]]) { // do blablabla } } } 

特别是我添加的是:

 if ([subview isMemberOfClass:[UIAlertButton class]]) { // do blablabla } 

但是它找不到UIAlertButton类,为什么? 谢谢

编辑:这是我最后的工作代码,感谢nsguliver。

CustomAlertView.h

 #import <UIKit/UIKit.h> @interface CustomAlertView: UIAlertView { NSMutableArray *fakeButtonIndexList; NSMutableArray *buttonList; } -(void)addCustomButton:(NSString*)title; @end 

CustomAlertView.m

 #import "CustomAlertView.h" @implementation CustomAlertView -(id) initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... { self = [super initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil]; if (self) { buttonList = [NSMutableArray array]; fakeButtonIndexList = [NSMutableArray array]; } return self; } -(void)layoutSubviews { for (UIView *subview in self.subviews){ //Fast Enumeration // Image de fond if ([subview isMemberOfClass:[UIImageView class]]) { subview.hidden = YES; //Hide UIImageView Containing Blue Background } // Label if ([subview isMemberOfClass:[UILabel class]]) { //Point to UILabels To Change Text UILabel *label = (UILabel*)subview; //Cast From UIView to UILabel label.shadowColor = [UIColor blackColor]; label.shadowOffset = CGSizeMake(0.0f, 1.0f); } } } -(void)drawRect:(CGRect)rect { //////////////GET REFERENCE TO CURRENT GRAPHICS CONTEXT CGContextRef context = UIGraphicsGetCurrentContext(); //////////////CREATE BASE SHAPE WITH ROUNDED CORNERS FROM BOUNDS CGRect activeBounds = self.bounds; CGFloat cornerRadius = 10.0f; CGFloat inset = 6.5f; CGFloat originX = activeBounds.origin.x + inset; CGFloat originY = activeBounds.origin.y + inset; CGFloat width = activeBounds.size.width - (inset*2.0f); CGFloat height = activeBounds.size.height - (inset*2.0f); CGRect bPathFrame = CGRectMake(originX, originY, width, height); CGPathRef path = [UIBezierPath bezierPathWithRoundedRect:bPathFrame cornerRadius:cornerRadius].CGPath; //////////////CREATE BASE SHAPE WITH FILL AND SHADOW CGContextAddPath(context, path); CGContextSetFillColorWithColor(context, [UIColor colorWithRed:40.0f/255.0f green:40.0f/255.0f blue:40.0f/255.0f alpha:1.0f].CGColor); CGContextDrawPath(context, kCGPathFill); //////////////CLIP STATE CGContextSaveGState(context); //Save Context State Before Clipping To "path" CGContextAddPath(context, path); CGContextClip(context); } -(void)show { [super show]; // On redéfinit les frames des boutons NSInteger indexCustomButton = 0; for (NSString *indexStr in fakeButtonIndexList) { UIButton *customButton = (UIButton*)[buttonList objectAtIndex:indexCustomButton]; UIButton *fakeButton = (UIButton*)[self.subviews objectAtIndex:[indexStr integerValue]]; [customButton setFrame:fakeButton.frame]; indexCustomButton++; } } -(void)addCustomButton:(NSString *)title { [self addButtonWithTitle:title]; UIButton *fakeButton = [self.subviews lastObject]; [fakeButton setHidden:YES]; [fakeButtonIndexList addObject:[NSString stringWithFormat:@"%d",[self.subviews count]]]; UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button setFrame:fakeButton.frame]; [button setTitle:title forState:nil]; [button setBackgroundColor:[Templates getColor:@"color"]]; [button.layer setCornerRadius:5.0f]; [buttonList addObject:button]; [self addSubview:button]; } @end 

你可以通过首先保持两个button标题nil ,然后添加自定义button作为你的CustomAlertView subview ,你可以自定义UIAlertView的button的一种方法,请参阅下面的代码自己testing。

 CustomAlertVIew *alert =[[CustomAlertVIew alloc]initWithTitle:@"title" message:@"message" delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil]; // add the custom button UIImage *buttonImage = [UIImage imageNamed:@"image.png"]; //create the button and assign the image UIButton *alertButton = [UIButton buttonWithType:UIButtonTypeCustom]; [self.alertButton setFrame:CGRectMake(x,y,buttonImage.size.width,buttonImage.size.height)]; [alertButton setBackgroundImage:buttonImage forState:UIControlStateNormal]; alertButton.titleLabel.font = [UIFont boldSystemFontOfSize:12]; [alertButton setTitle:@"Done" forState:UIControlStateNormal]; [alertButton addTarget:self action:@selector(backMethod) forControlEvents:UIControlEventTouchUpInside]; [alert addSubview:alertButton]; [alert show]; 

你的问题已经很好的回答了,但是我的解决scheme可能更短,更清洁。 首先,我创build了一个跟踪subviews-array中button索引的variables。 我假设AlertViewButtons是最后一个子视图:

 int buttonIndexInSubviews = (self.subviews.count - self.numberOfButtons); 

然后我重复遍历子视图如图所示,而if语句形成不同。 诀窍是将AlertViewButton强制转换为超类。

 if (subview == [self.subviews objectAtIndex:buttonIndexInSubviews]) { UIButton *button = (UIButton*)subview; //Here you can change the button appearance via the variable //Eg button.titleLabel.shadowOffset = CGSizeMake(0.0f, 0.0f); buttonIndexInSubviews++; } 

顺便说一句,这个解决方法是由苹果批准的。

或者你可以像这样testingUIAlertButton类:

 if ([subview isMemberOfClass:NSClassFromString(@"UIAlertButton")]) { // do your customizing here... }