2012-01-16 70 views
12

在一个类的方法方法我声明如下:我可以使用类方法,如委托回调

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

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

现在问题,如果该方法是一个类方法或不,以便在用户与我的AlertView交互时调用?

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

+1

你的意思是类方法? :P – 2012-01-16 17:08:19

+0

您可以尝试使用班级名称,而不是指导实例的self。 – 2012-01-16 17:11:41

+0

另请参阅http://stackoverflow.com/questions/1781046/dynamically-invoke-a-class-method-in-objective-c的答案。我认为这是相关的。在类方法中使用 – 2012-01-16 17:14:41

回答

11

首先,我假定通过“静态”方法,您的意思是类方法(用+而不是-声明)。

“编译器不抱怨”关于Objective-C并不总是告诉你很多。所有这一切意味着你已经确信编译器应该(或至少可能)在运行时工作。最后,如果你作为一个委托提供的对象响应正确的消息,编译器不会在意它是一个类(运行时也不会)。在这种情况下,您从类方法提供self。这就好像你输入了[MyClass class]

我认为这是否是应该所做的 - 但这可能超出了您的问题范围。

14

我想和大家分享我的一些研究结果:

  1. 不要紧,我是否宣布这样delegate:selfdelegate:[MyClass class]

  2. 但是委托,这非常重要我怎么申报方法:

    这工作

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

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

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

是的,'self'和'[MyClass class]'在“MyClass”方法中是等价的。 如果你想让你的类本身成为委托,那么你必须声明这是一个类方法。该文档描述了如何实现实例方法,我认为它非常普遍地“如何实现”。最后,真正重要的是,无论您作为委托提供的对象是否响应“alertView:clickedButtonAtIndex:”选择器。 所以,是的,答案仍然是,你*可以*做到这一点。你是否应该是不同的。 – huskerchad 2012-01-16 18:17:59

+0

哇!如果不是在一百万年内,我会猜测将委托方法转变为类方法将是一条可行的路。谢谢谢谢!我已经失去了5个多小时试图解决类似的问题。 ...不需要NSCondition或执行选择器或任何东西! – JohnQ 2013-05-22 02:39:12

+0

非常感谢你!!!!!!!!!!! – ElizaS 2014-03-04 16:08:50

1

可以呀!一个类也是一个对象。