2012-10-09 26 views
0

我为UIAlertView创建了类别,并且重写了委托方法willPresentAlertView,但是我的方法没有被激发。如何覆盖类别中的委托方法?

示例代码:

@interface UIAlertView (CustomAlert) 
@end 

@implementation UIAlertView (CustomAlert) 
- (void)willPresentAlertView:(UIAlertView *)alertView1 
{ 

    for (UIView *sub in [alertView1 subviews]) 
    { 
     if([sub class] == [UIImageView class]) 
     { 
      ((UIImageView *)sub).image=nil; 
      ((UIImageView *)sub).backgroundColor = [UIColor blackColor]; 
     } 
    } 

    [alertView1.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 
    [alertView1.layer setCornerRadius:0]; 
    [alertView1.layer setBorderWidth:2]; 
} 

@end 
+0

为什么你想要它在一个类别?什么目的? –

+0

委托方法从委托对象运行,源对象hav只启动将以委托对象需要的方式执行的方法。如果你想要额外的功能,你可以把它写在类别或子类中。如果你想实现委托方法,你可以在委托对象的类中完成。 –

+0

您是否将警报视图设置为其自己的代理? – jrturton

回答

3

如果您的目的是提供willPresentAlertView委托方法的默认实现,那么你的方法(在UIAlertView类别定义willPresentAlertView)是正确的。你只需要通过自身的警报作为代表,这样的方法被称为:

UIAlertView* alert = ... 
alert.delegate = alert; 

如果你不这样做,你的委托方法将不会被调用。

另一方面,我怀疑定义这样的默认实现是非常有用的,因为原则上每个alert都需要它自己特定的委托方法。

+0

非常感谢,它工作正常 – Spynet

1

简单:

@interface MONBlackStyle : NSObject // << new class, not category 
+ (void)willPresentAlertView:(UIAlertView *)alertView1; 
@end 

@interface MONOrangeStyle : NSObject // << new class, not category 
+ (void)willPresentAlertView:(UIAlertView *)alertView1; 
@end 

不需要类别。当然,在UIAlertView上使用该类别时,警报参数是多余的,当然,如果访问是问题,上述消息的定义可能会调用其他类别方法。还要注意,在这个确切的例子中,代表将被设置为:alert.delegate = [MONOrangeStyle class];这是朝着正确方向迈出的一步,但是可以采取更多步骤。祝你好运。