【问题标题】:Delegate works in controller A but not in controller B委托在控制器 A 中工作,但不在控制器 B 中
【发布时间】:2011-08-24 13:11:12
【问题描述】:

这是代表

@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;

我能够在一个控制器中接收调用,但在另一个控制器中不能接收(代码是模仿者),这让我发疯!

【问题讨论】:

  • 如果那是一个单例,那么您将覆盖之前设置的委托。
  • 你的 other 控制器是什么意思?看起来你正在调用一个单例。
  • 单身不是问题,我有另一个与委托共享对象,就像一个魅力。
  • 我有 2 个控制器需要接收来自 DropControllerDalegate 的调用,第一个按预期工作,第二个没有,我不知道为什么,因为代码相同

标签: iphone objective-c ios delegates


【解决方案1】:

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

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


编辑:

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

【讨论】:

  • 我会说,它更像是一个广播消息,但带有一个 for 循环。
  • 并且可能是使用通知解决而不是委托的候选人。
  • 我编辑了问题并添加了单例的东西,只是为了更清楚
  • Shared + Delegate 从未造成过问题
  • 您能解释一下当您将多个对象作为委托分配给单个共享对象时,如何调用这两种方法?我也想知道我是否遗漏了什么。
猜你喜欢
  • 2016-08-20
  • 2015-04-22
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多