设置UIAlertView委托

时间:2014-05-06 11:21:06

标签: ios objective-c delegates uialertview

我尝试调用委托方法,但它不是。我应该在代码中更改什么?谢谢。

我尝试添加Class1.m:

+(void)popupAlert:(NSString*)msg tag:(NSInteger)tag{
       Class1 *c= [[Class1 alloc]init];
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
                                                        message:msg
                                                       delegate:c (I also tried c.self)
                                              cancelButtonTitle:...
                                              otherButtonTitles:...,nil];
        alert.tag=tag;
        [alert show];
    }

我尝试设置alertview委托来调用此委托方法。

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

这是我正在做的事情: Class1.h:

+(void)popupAlert:(NSString*)msg tag:(NSInteger)tag;

Class1.m:

+(void)popupAlert:(NSString*)msg tag:(NSInteger)tag{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
                                                    message:msg
                                                   delegate:self
                                          cancelButtonTitle:...
                                          otherButtonTitles:...,nil];
    alert.tag=tag;
    [alert show];
}
-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
//some coding
}

Class2.m:

-(void)func1{
[Class1 popupAlert:@"blah blah" tag:0];
}

3 个答案:

答案 0 :(得分:2)

似乎c在[alert show]之后立即被释放;因为之后没有强烈的引用指向此对象,并且委托变为nil;

在其他示例中,您应该启用实例方法

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

到类方法:

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

答案 1 :(得分:1)

重新思考你的架构。

您正在类方法中创建警报。 (由前导+而非-表示。在self内是对类的引用,而不是对象。

alertView:didDismissWithButtonIndex:是一种实例方法。我甚至不确定您是否可以将代理协议应用于类而不是实例。但是如果可以,那么你的委托方法也必须是一个类方法。

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

好吧,我只是想到了这一点,并且不要承诺它是这样运作的。 如果我是你,我会选择单例模式并使用实例方法抛出警报并响应委托协议。

无论如何,我想知道代表上显示哪个警告xcode:self以及为什么你没有告诉我们这个警告。警告是有原因的。

答案 2 :(得分:0)

Alertview委托属性是周引用。

所以一旦你完成了+(void)popupAlert:(NSString *)msg标签:(NSInteger)标签方法,那么堆栈上的所有局部变量都将从内存中删除。

意味着被摧毁。所以即使你把代表设置在那里它也不会工作。

  @property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate;   

所以你应该这样做

-(void)func1{

    Class1 *class1 = [[Class1 alloc] init];

    [Class1 popupAlert:@"blah blah" tag:0 withDelegate:class1];
}



+(void)popupAlert:(NSString*)msg tag:(NSInteger)tag withDelegate:(id)delegateOfAlert]{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
                                                    message:msg
                                                   delegate:delegateOfAlert
                                          cancelButtonTitle:...
                                          otherButtonTitles:...,nil];
    alert.tag=tag;
    [alert show];
}