2013-05-29 29 views
0

我想调用类方法的委托使用委托。在一个类的方法

下面明显的例子是不行的,因为该委托是一个类方法中访问一个实例变量。 (错误:实例变量“委托”中的方法来访问)

是否有一个alertnative?

我的头文件:

// MyClass.h 

#import <Foundation/Foundation.h> 

@protocol MyDelegate <NSObject> 

-(void)update; 

@end 

@interface MyClass : NSObject 
{ 
    id<MyDelegate> delegate; 
} 
@property (nonatomic, retain) id delegate; 

+(void)methodThatInvokesDelegate; 
@end 

我实现文件:

// MyClass.m 
#import "MyClass.h" 

@implementation MyClass 
@synthesize delegate; 

+(void)methodThatInvokesDelegate{ 
[delegate update]; 
} 

@end 
+3

你错过了在协议前面的“@”清理。你看到的问题究竟是什么? –

+0

@MikeM上面只是一个例子。没有我实际使用的代码。但只是为了说明问题。我编辑了我的帖子并添加了“@”。在类方法中访问错误i':“实例变量'委托' – steak2002

+0

为什么你想这样做?也许你最好使用单例模式? – Marcel

回答

3

三个明显的选择:

  • 辛格尔顿
  • 静态变量(即类变量)指向代表
  • 使用NSNotification的,而不是代表

由于单(和静态变量)不能让代表们的生命周期的轨道,我觉得第三个选项是最干净的。

+0

我不会采取选项3,因为通知是“非目标” ,而委托则是“有针对性的”,有针对性地我想说,委托指向一个特定的对象 –

+0

@ AminNegm-Awad我明白你的观点,但我们试图在这里做一些有点奇怪的事情,有些破损。在这种情况下,我会考虑通知是次要的。 –

+0

这是一个值得肯定的主题。但我认为,一个静态变量并不是什么坏事。例如,对于通知,您将永远不会有返回值。 –

0

我想知道的情况下,它让你在这种情况下运行。 ;-)不管怎么说:

第一:代表们针对特定的实例对象设置。正因为如此,您可以针对同一个(委派)类的不同实例拥有不同的委托。

二:A类方法类的一个类对象内运行。这是一个与该类的每个实例对象不同的对象。所以没有什么可以称为“代表”的。你可以有100名代表。

第三:你类对象需要在自己的委托。所以你必须添加一个属性delegate到类对象然后使用它。 (是的,这是可能有特性的一类对象。我也写声明的属性)。如果您需要关于如何做到这一点的详细信息,只是发表评论吧。我将添加代码。

0

我不知道这是否会帮助你,但我也有类似的情况我有用于数据加载一个类的方法。在这种情况下,类实例化本身,直到它完成(这样,来电者不需要)。 (此代码有所修改,使其在这里工作)

头文件:

@protocol DataLoaderDelegate2 <NSObject> 
    - (void) dataLoaderSuccess:(NSData *)data loader:(id)theloader; 
    - (void) dataLoaderFailed:(NSString *)error loader:(id)theloader; 
    @end 

    @interface DataLoader2 : NSObject { 
      NSURLConnection *conn; 
      NSMutableData *receivedData; 
      NSFileHandle *fileHandle; 
      id <DataLoaderDelegate2> delegate; 
    } 
    @property (nonatomic, assign) id<DataLoaderDelegate2>delegate; 

呼叫启动进程 - 调用initWithRequest通过“自我”一起。

+ (DataLoader2 *)loadWithURLRequest:(NSURLRequest *)req delegate:(id)_delegate 
    { 
     DataLoader2 *dl = [[DataLoader2 alloc] init]; 
     [dl setDelegate:_delegate]; 
     conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
     return dl; 
    } 

当数据加载完成,它的东西,如

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
    { 

      if ([delegate respondsToSelector:@selector(dataLoaderSuccess:loader:)]) 
        [delegate dataLoaderSuccess:(fileHandle)?(id)fileHandle:(id)receivedData loader:self]; 
      [self autorelease]; 
    } 
相关问题