如何让我自己的警报类响应alertView clickedButtonAtIndex?

时间:2013-11-19 10:31:56

标签: objective-c class optimization uialertview

我有一个名为AlertView的类,因为我在我的应用程序中使用了很多警报,我想优化我的UIAlertViews的使用。

但是当我希望我的AlertView类响应该方法时,我遇到了一个问题:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

这是UIAlertView在我的AlertView.h中的外观

+ (void)simpleWithMessage:(NSString *)message withTag:(int)tag withOtherBtnTitle:(NSString *)otherBtnTitle;

这就是UIAlertView在我的AlertView.m中的外观。

#pragma mark - Simple alert with tag

+ (void)simpleWithMessageAndTag:(NSString *)message withTag:(int)tag withOtherBtnTitle:(NSString *)otherBtnTitle
{
    UIAlertView *simpleWithMessageWithMessageAndTagAlertView = [[UIAlertView alloc] initWithTitle:@"Confirm your choice!"
                                                        message:message
                                                       delegate:self
                                              cancelButtonTitle:@"Cancel"
                                              otherButtonTitles:otherBtnTitle, nil];

    simpleWithMessageWithMessageAndTagAlertView.tag = tag;

    [simpleWithMessageWithMessageAndTagAlertView show];
}

在另一个类中,我导入了我的AlertView.h,当我调用它时它工作正常:

[AlertView simpleWithMessage:@"Do you want to delete?" withTag:901 withOtherBtnTitle:@"Yes"];

但是我使用的标签没有响应我的AlertView类方法:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    // Button actions for alert view with tag 901
    if (alertView.tag == 901) {
        if (buttonIndex == 1) {
            [self deleteMissionState];
        }
    }
}

任何人都可以帮助我解决我在这里缺少的东西,或者是否有可能做我想做的事情。

提前致谢!

已编辑

找到这个帮助我解释单身人士的教程: http://www.youtube.com/watch?v=FTfEN8KQPK8

1 个答案:

答案 0 :(得分:3)

问题是您的方法simpleWithMessageAndTag:withTag:WithOtherBtnTitle:是一个类方法(使用+而不是-声明),并且当您指定self作为其中的委托时方法,成为委托,而不是类的实例。

同时回调方法alerView:clickedButtonAtIndex:是一个实例方法(-而不是+),因此该类不响应该选择器(该类的对象会)。如果您将-更改为+(尽管它违反了UIAlertViewDelegate协议的文本),它可能会有效:

+ (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

或者,更好的是,将simpleWithMessageAndTag:withTag:WithOtherBtnTitle:更改为实例方法并创建您调用该方法的类的实例(例如,单例),例如:

[[MyAlertViewFactory sharedFactory] simpleWithMessageAndTag:…];
// sharedFactory returns the same instance of MyAlertViewFactory every time