如何覆盖类别中的委托方法?

时间:2012-10-09 10:16:11

标签: objective-c ios5 override uialertview objective-c-category

我已为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

2 个答案:

答案 0 :(得分:3)

如果您的意图是为willPresentAlertView委托方法提供默认实施,那么您的方法(在willPresentAlertView类别中定义UIAlertView)是正确的。您只需将警报本身作为委托传递,以便调用该方法:

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

如果不这样做,则不会调用您的委托方法。

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

答案 1 :(得分: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];这是朝着正确方向迈出的一步,但可以采取更多步骤。祝你好运。