调用委托的委托

Posted

技术标签:

【中文标题】调用委托的委托【英文标题】:Calling the delegate of a delegate 【发布时间】:2011-09-08 16:17:24 【问题描述】:

我正在开发一个继承别人代码的 iPhone 项目。我有一种情况,viewController A 有一个 UIWebView,它被设置为那个 UIWebView 的委托。

我还有一个 B 类,它被设置为 viewController A 的委托。

在 B 的实例中,我想使用 stringByEvaluatingjavascriptFromString 将一些 javascript 发送到 viewController A 中的 UIWebView。

最好的方法是什么?

【问题讨论】:

【参考方案1】:

您可以让 viewController A 成为 Class B 的委托,这样您就可以从 Class B 调用 viewController A 上的方法,然后 UIWebView 可以执行所需的 javascript。

@protocol ClassBDelegate
- (void) executeJavascript:(NSString*)jsString;
@end

@interface ClassB : NSObject<ViewControllerADelegate>
@property (nonatomic, assign) id<ClassBDelegate> delegate;
@end

@implementation ClassB
- (void) myFunc

   ...
   [self.delegate executeJavascript:@"alert('Awesome!');"];

@end

上面缺少一些东西,例如 B 类实例的委托属性分配给 viewControllerA。

你还需要类似的东西:

@interface ClassA : UIViewController<ClassBDelegate>
...
- (void) executeJavascript:(NSString*)jsString;
@end

@implementation ClassA
...
- (void) executeJavascript:(NSString*)jsString

   [self.myWebView stringByEvaluatingJavaScriptFromString:jsString];

@end

操作 UIElement 应该留给拥有 UIElement 的视图控制器,因此我建议使用委托。通过对 viewController A 的引用,您可以直接操作 UIWebView,但我强烈建议您不要这样做。有了这样的代码,谁知道还有哪些其他类也在对 UIElements 进行更改。

【讨论】:

听起来不错。我不确定让 A 成为 B 的代表和 B 成为 A 的代表是否是一种好习惯。 @Phil John,有时这是不可避免的。请注意,@Sam 使用委托的 assign(或 5.0 中的 weak)引用正确执行此操作。否则你可能会得到一个保留周期。见cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html

以上是关于调用委托的委托的主要内容,如果未能解决你的问题,请参考以下文章

C#图解教程 第十三章 委托

3.C#中的多重委托

C# 笔记——委托

C# 委托及各种写法

UIPopoverController 委托委托方法未被调用

委托与事件