【问题标题】:Change the class of a widget on a xib? (Change a UIWebView to my own Category of UIWebView)在 xib 上更改小部件的类? (将 UIWebView 更改为我自己的 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];
}

【问题讨论】:

    标签: objective-c interface-builder xib objective-c-category


    【解决方案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 中已经回答了很多类似的问题。例如,试试herehere
    • 感谢您的链接,但这就是我获得问题中列出的代码的地方。正如我所说,这些答案要么 [a] 子类化一个小部件,我们不应该根据文档对 UIWebView 进行子类化,或者 [b] 他们谈论在 UIWebView 上使用类别,但没有准确解释如何在 UIWebView 上实现类别在界面生成器中使用。因此我的问题是:如何在 Interface Builder 的 xib 上使用类别?.
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多