在 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 类别)的主要内容,如果未能解决你的问题,请参考以下文章

升级时更改 Android 小部件大小

QPushButton 更改同一布局中其他小部件的边距

Qt - 重新加载小部件内容

Flutter-当内容更改时淡入淡出动画文本小部件

在运行时更改 QML 小部件

更改标签的文本在透明小部件上无法正常工作