Сменить класс виджета на xib? (Измените UIWebView на мою собственную категорию UIWebView)

У меня есть рабочий .xib в Xcode 5. Главный виджет - UIWebView. Виджет имеет правильное расположение, соединения и розетки.

Позже я создал категорию UIWebView (UIWebView + ReadOnlyPageContent), чтобы переопределить метод canPerformAction:withSender:.

➥ Есть ли способ переназначить класс виджета категории?

В инспекторе идентичности Xcode> Пользовательский класс> Поле класса я вижу «UIWebView». Но текст затенен, и только «UIWebView» отображается во всплывающем меню.

Снимок экрана инспектора удостоверений Xcode› Пользовательский класс ›Поле класса

В моем контроллере представления я попытался переопределить виджет 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];
}

person Basil Bourque    schedule 14.11.2014    source источник


Ответы (1)


Категория в классе UIWebView не появится в Xcode в таком виде. Если бы вы создали подкласс UIWebView, он бы появился там, но Категория - это просто расширение существующего класса UIWebView.

Более важный вопрос: что вы делаете в категории, к которой вам нужен доступ в Xcode?

Обновление:

Apple не рекомендует использовать категорию для переопределения существующего метода класса. Подробнее см. В этом ответе Stack Overflow: Переопределение методов с использованием категорий в Objective-C

Вот ключевая фраза:

Хотя язык Objective-C в настоящее время позволяет вам использовать категорию для переопределения методов, наследуемых классом, или даже методов, объявленных в интерфейсе класса, вам настоятельно не рекомендуется это делать. Категория не заменяет подкласс.

Если цель состоит в том, чтобы просто отключить копирование и вставку в веб-представлении, может быть проще просто вставить некоторый CSS в HTML, например:

<style>
* {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
}
</style>
person Axeva    schedule 14.11.2014
comment
Я просто пытаюсь отключить выбор / вырезание / копирование / вставку содержимого страницы в UIWebView. Я видел много мест в Интернете, где предлагался код, указанный в моем вопросе, вместо canPerformAction:withSender. Но никто не объясняет, как именно переопределить метод на UIWebView. Итак, я написал категорию, чтобы переопределить этот метод, но как мне заставить виджет UIWebView на xib использовать эту категорию? - person Basil Bourque; 14.11.2014
comment
Если конечная цель - просто отключить копирование и вставку в веб-представлении, есть много похожих вопросов, на которые уже дан ответ в Stack Overflow. Попробуйте здесь и , например, здесь. - person Axeva; 14.11.2014
comment
Спасибо за ссылки, но именно здесь я получил код, указанный в моем вопросе. Как я уже сказал, эти ответы либо [a] подклассифицируют виджет, и мы не должны создавать подкласс UIWebView для документа, либо [b] они говорят об использовании категории в UIWebView, но не объясняют, как именно реализовать категорию в UIWebView, когда используется в Интерфейсном Разработчике. Отсюда мой вопрос: Как использовать категорию на xib в Интерфейсном Разработчике?. - person Basil Bourque; 14.11.2014