【问题标题】:Can I use a class method as a delegate callback我可以使用类方法作为委托回调吗
【发布时间】:2012-01-16 17:03:41
【问题描述】:

在一个类方法方法中我声明如下:

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Hello" 
                                                   message:@"World"
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel" 
                                         otherButtonTitles:@"Done", nil];

现在即使包含方法是类方法,编译器也不会抱怨delegate:self。现在要成为代表,我必须在UIAlertViewDelegate 协议中实现该方法。

现在是否重要,如果该方法是类方法,以便在用户与我的 AlertView 交互时被调用?

我在问这个问题,因为我的类没有任何实例变量,所以我希望它只包含类方法。

【问题讨论】:

  • 你可以尝试使用类名而不是self,它指的是实例。
  • 另见stackoverflow.com/questions/1781046/… 的回复。我认为这很重要。
  • 在类方法中,self 指的是类,而不是类的对象。这段代码能运行吗?
  • 我编辑了static method 并将其更改为class method 感谢您的评论。我想这就是困扰我的 Java 背景 :-)

标签: objective-c ios cocoa-touch


【解决方案1】:

我想分享一些我的发现:

  1. 不管我是像delegate:self还是delegate:[MyClass class]这样声明委托

  2. 但是,我如何声明方法并不重要:

    这行得通

    +(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
        // Some Actions here
    }
    

    虽然下面的“语法”是UIAlertViewDelegate协议中的声明,但它不起作用

    // Mind the `-` sign at the start of the line.
    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
        // Some Actions here
    }
    

【讨论】:

  • 是的,self[MyClass class] 在“MyClass”方法中是等价的。如果您希望您的类本身成为委托,那么您必须将其声明为类方法。该文档描述了如何实现实例方法,我认为这几乎是普遍的“它是如何完成的”。最后,真正重要的是您作为委托提供的任何对象都会响应“alertView:clickedButtonAtIndex:”选择器。所以,是的,答案仍然是你可以做到。你是否应该是不同的。
  • 哇!在一百万年后,我猜想将委托方法转换为类方法将是可行的方法。谢谢谢谢!我已经失去了 5 多个小时试图解决类似的问题。 ...不需要 NSCondition 或 performSelector 或任何东西!
  • 我正在使用一个类方法作为我的MFMailComposeViewControllerDelegate,我收到这个警告:Incompatible pointer types assigning to 'id<MFMailComposeViewControllerDelegate> _Nullable' from 'Class _Nullable' 我的@interface 有<MFMailComposeViewControllerDelegate>,但是我该如何为类方法做到这一点并避免警告?
  • @Jeff。我的答案是 8 岁,所以我有点不习惯。我建议您打开一个新问题,并在其中引用此帖子。很抱歉无法为您提供更好的答案。
  • @Besi。谢谢你。我找到了一个合理的解决方法(它摆脱了警告)。我因此添加(id)controller.mailComposeDelegate = (id)[self class];
【解决方案2】:

首先,我假设“静态”方法是指类方法(用 + 而不是 - 声明)。

关于 Objective-C 的“编译器不会抱怨”并不总是能告诉你很多。它真正的意思是你已经让编译器相信一切都应该(或至少可以)在运行时工作。

最后,如果您作为委托提供的对象响应正确的消息,编译器将不会在意它是一个类(运行时也不会)。在这种情况下,您从类方法中提供self。就好像你输入了[MyClass class]

我认为这是否是您应该做的可能值得怀疑——但这可能超出了您的问题范围。

【讨论】:

    【解决方案3】:

    是的,你可以!类也是对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 2015-02-01
      相关资源
      最近更新 更多