委托在控制器A中工作,但不在控制器B中工作

时间:2011-08-24 13:11:12

标签: iphone objective-c ios delegates

这是代表

@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 :(得分:2)

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

然后遍历该数组并在其中的每个对象上调用该方法。它很简单。


编辑:

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