在 xib 上更改小部件的类? (将 UIWebView 更改为我自己的 UIWebView 类别)
Posted
技术标签:
【中文标题】在 xib 上更改小部件的类? (将 UIWebView 更改为我自己的 UIWebView 类别)【英文标题】:Change the class of a widget on a xib? (Change a UIWebView to my own Category of UIWebView) 【发布时间】:2014-11-14 01:28:06 【问题描述】:我在 Xcode 5 中有一个可用的 .xib。主要小部件是 UIWebView
。小部件的位置、连接和插座都正确排列。
后来我创建了一个 UIWebView 的 Category (UIWebView+ReadOnlyPageContent) 来覆盖canPerformAction:withSender:
方法。
➥ 有没有办法将小部件的类重新分配给类别?
在 Xcode 的身份检查器 > 自定义类 > 类字段中,我看到“UIWebView”。但是文本是灰色的,弹出菜单中只列出了“UIWebView”。
在我的视图控制器中,我尝试重新定义 UIWebView 小部件,从这里开始:
IBOutlet UIWebView *webView; // Works.
到我的类别,带有#import
的类别:
IBOutlet UIWebView+ReadOnlyPageContent *webView; // Fails. 3 compiler errors.
作为替代方案,我考虑过创建 UIWebView 的子类。但是文档说 UIWebView 不应该被子类化。所以使用类别是我能想到的唯一方法来覆盖canPerformAction:withSender:
方法。
- (BOOL)canPerformAction:(SEL)action
withSender:(id)sender
if (
action == @selector(select:) ||
action == @selector(copy:) ||
action == @selector(cut:) ||
action == @selector(paste:)
)
return NO;
return [super canPerformAction:action withSender:sender];
【问题讨论】:
【参考方案1】:UIWebView 类上的类别不会像那样出现在 Xcode 中。如果您创建了 UIWebView 的子类,它会出现在那里,但 Category 只是现有 UIWebView 类的扩展。
更大的问题是:你在 Xcode 中需要访问的类别中做什么?
更新:
Apple 不鼓励使用类别来覆盖现有的类方法。有关详细信息,请参阅此 Stack Overflow 响应:Overriding methods using categories in Objective-C
这里是关键词:
虽然目前 Objective-C 语言允许你使用 类别来覆盖类继承的方法,甚至方法 在类接口中声明,强烈建议您不要 这样做。 类别不能替代子类。
如果目标只是在 web 视图中禁用复制和粘贴,则将一些 CSS 注入 html 可能更容易,例如:
<style>
*
-webkit-touch-callout: none;
-webkit-user-select: none;
</style>
【讨论】:
我只是想禁用 UIWebView 中页面内容的选择/剪切/复制/粘贴。我在网上看到很多地方都建议我的问题中列出的代码,覆盖canPerformAction:withSender
。但没有人具体解释如何覆盖UIWebView
上的方法。所以我写了一个 Category 来覆盖那个方法,但是如何让 xib 上的 UIWebView 小部件使用这个 category?
如果最终目标只是在 Web 视图中禁用复制和粘贴,那么 Stack Overflow 中已经回答了很多类似的问题。例如,试试here 和here。
感谢您的链接,但这就是我获得问题中列出的代码的地方。正如我所说,这些答案要么 [a] 子类化一个小部件,我们不应该根据文档对 UIWebView 进行子类化,或者 [b] 他们谈论在 UIWebView 上使用类别,但没有准确解释如何在 UIWebView 上实现类别在界面生成器中使用。因此我的问题是:如何在 Interface Builder 的 xib 上使用类别?.以上是关于在 xib 上更改小部件的类? (将 UIWebView 更改为我自己的 UIWebView 类别)的主要内容,如果未能解决你的问题,请参考以下文章