【问题标题】:Set UIAlertView delegate设置 UIAlertView 委托
【发布时间】:2014-05-06 11:21:06
【问题描述】:

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

我尝试在 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];
}

【问题讨论】:

  • 您的代码中有很多问题和严重错误。您应该考虑阅读有关 iOS 开发和 Objective-C 的初学者书籍。
  • + 方法更改为- 方法。 Class2 应该有一个 Class1 对象(作为一个属性),它将为其调用方法。
  • @dasdom 我会的。但你能具体说明问题和错误是什么吗?所以我可以更深入地了解它们。谢谢。
  • 1.名称。 Objective-C 非常冗长。 2. 内存管理和范围。当popupAlert 返回时,c 将消失。 3. 类方法和实例方法的区别。
  • 感谢您的回答。我会尝试编辑我的代码。

标签: ios objective-c delegates uialertview


【解决方案1】:

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

在其他例子中你应该转实例方法

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

到类方法:

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

【讨论】:

  • 但是我在委托方法中有实例方法。我不能做你所说的:/我现在正在阅读所有答案。然后我会看看如何更改我的代码。
  • 我标记了 Vijay-Apple-Dev.blogspot 的答案,但你们俩在该主题上相似。谢谢,我也赞成你的回答。
【解决方案2】:

重新思考您的架构。

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

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

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

好吧,我只是在想这个,不保证它会这样工作。 如果我是你,我会选择单例模式并使用实例方法来引发警报并响应委托协议。

无论如何,我想知道 xcode 在 delegate:self 上显示哪个警告以及为什么您不告诉我们有关警告的信息。警告是有原因的。

【讨论】:

  • 其实一开始我在Class1中创建了UIAlertViews,但是Class1很长。所以我试图将 Class1 分成一些类。例如:CreatingAlert、ControllingTextFields 等。我问的问题是关于 CreatingAlert。我决定在 Class2 中创建警报,而不是在 Class1 视图控制器中创建它们。将这样的类拆分以提高效率是错误的,还是看起来很高效但只会使代码更复杂?
  • 拆分一个类通常并没有错,但不仅仅是因为它很长。您可能会发现其他可以更容易拆分的辅助方法。
  • 感谢您的回答。我会搜索一下。
【解决方案3】:

Alertview 委托属性是周参考。

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

表示销毁。所以即使你在那里设置了委托,它也不会工作。

  @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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多