2011-08-24 116 views
0

这是代表代表工作在控制器A但不在控制器B

@protocol DropControllerDelegate; 

@interface DropController : NSObject 
    id<DropControllerDelegate> delegate; 
} 

@property (nonatomic, assign) id<DropControllerDelegate> delegate; 
+ (DropController*) sharedController; 

@protocol DropControllerDelegate <NSObject> 
- (void)openUserButtons; 
- (void)startUpload; 
- (void)uploadDone; 
- (void)uploadFailed; 
- (void)startDownload; 
- (void)downloadDone; 
- (void)subFolderLoaded; 
@end 

这是单代码:

static DropController *sharedCont = nil; 

#pragma mark Singleton stuff 

+ (DropController *) sharedController { 
    @synchronized(self)  { 
     if (!sharedCont) 
      sharedCont = [[DropController alloc] init]; 
     return sharedCont; 
    } 
    return sharedCont; 
} 

设置代表该代码是(在myControllerA和myControllerB ):

DropController* dropHelper = [DropController sharedController]; 
dropHelper.delegate = self; 

我能够在一个控制器中接收呼叫,但不能在其他控制器中接收呼叫(代码是一个山寨版),这让我疯狂!

+1

如果这是一个单身人士,那么你以前覆盖了委托集。 –

+0

你的*其他*控制器是什么意思?看起来你正在打电话给一个单身人士。 – Perception

+0

单身并不是一个问题,我有另一个与委托的共享对象,就像一个魅力。 – Enlil

回答

2

正如我在我的评论中所说的,由于您使用的是该对象的共享实例,因此它将覆盖之前设置的新代理对象。所以我建议在你的sharedController中保存一个数组。将对象添加到将要成为sharedController委托的数组中。

然后遍历该数组并调用该方法遍历每个对象。它非常简单。


编辑:

当分配在viewcontroller A的发言dropHelper.delegate = self;对象A成为委托的委托。调用方法[delegate openUserButtons];将触发viewcontroller A中的方法。但是当您在视图控制器B中执行dropHelper.delegate = self;时,[delegate openUserButtons];将调用对象B中的方法。它不会同时调用a和b中的方法。由于只有一个委托变量,并且您正在使用共享的单身人员对象。

+0

我会说,它更像是一个广播消息,但用for循环。 –

+0

并且可能是使用通知来解决而不是委托的候选人。 – gamozzii

+0

我编辑了这个问题,并添加了单身人士的东西,只是为了更清楚 – Enlil