WebView
通过WebEditingDelegate
支持一种机制,使代理可以为WebView
(或私有的WebHTMLView
)接收到的各种操作实现自定义行为。当诸如以下操作之一发生时:
-(void)changeAttributes:(id)sender
当 WebHTMLView
接收到时,它将被传递到委托方法中:
-(BOOL)webView:(WebView *)webView doCommandBySelector:(SEL)command
不幸的是,该机制不提供在原始操作方法中传递“sender”的功能。
对于绝大多数操作,发送者并不重要,但对于例如changeAttributes和changeFont等操作,合同要求接收方调用“sender”以便执行convertAttributes:或convertFont:等操作。
对于changeFont情况,调用[[NSFontManager sharedFontManager] convertFont:]就足够了,因为恰好这就是发送者。
在changeAttributes情况下,特别是当删除线被更改时,发送者可能是一个名为“NSFontEffectsBox”的私有类,它可能对应于负责更改删除线/等设置的字体面板的子部分。
不幸的是,调用[[NSFontManager sharedFontManager] convertAttributes:]不能获得预期的属性更改。这使得一个有兴趣有意义地实现此方法的委托陷入了困境:
1.WebKit不传递发送者,因此委托无法进行合同性的[sender convertAttributes:]调用。
2.changeAttributes:调用被发送到一个私有的WebKit类WebHTMLView,无法对其进行子类化,以自定义changeAttributes:的行为。
3.changeAttributes:调用的发送者NSFontEffectsBox是一个私有类,无法访问,例如[NSFontEffectsBox sharedFontEffectsBox]。
简而言之:似乎没有办法让开发人员有意义地覆盖WebView的changeAttributes:行为。
有什么想法吗?