我尝试调用委托方法,但它不是。我应该在代码中更改什么?谢谢。
我尝试添加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];
}
答案 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];
}