Как мне вызвать исходную функцию из перегруженной функции в категории?

StackOverflow https://stackoverflow.com/questions/1514692

Вопрос

В Objective-C у меня есть категория для класса:

@interface UILabel(CustomInit)

- (id)initWithCoder:(NSCoder *)coder;

@end

Что я делаю, так это пишу пользовательскую функцию инициализации, которая выполняет некоторые дополнительные действия, и что я хотел бы сделать, так это в этой пользовательской функции инициализации вызвать базовый initWithCoder UILabel .Возможно ли это?Как же так?

Редактировать

Спасибо.Ладно, значит, мои планы спорны.Нельзя просто перегрузить initWithCoder.Есть ли способ достичь той же функциональности (где все UILabels получают этот дополнительный шаг инициализации) без перегрузки initWithCoder?Или, возможно, есть пример кода для initWithCoder UILabel, который я могу просто переписать с добавленным кодом?

Редактировать

Хорошо, итак, чтобы было ясно, что я пытаюсь:

Могу ли я встроить пользовательский шрифт в приложение для iPhone?

имеет ответ, в котором кто-то вручную добавляет пользовательский шрифт на iphone, используя частную функцию GraphicServices GSFontAddFromFile.Я попробовал этот код, и он отлично сработал для ручной настройки шрифта метки.Однако, если вы попытаетесь установить шрифт в Interface Builder, он не загрузится должным образом, а просто перейдет к системному шрифту.Что я хотел сделать, так это загрузить шрифт вручную и автоматически установить шрифт метки с выбранным шрифтом в IB.Таким образом, мне не нужно делать отдушину для каждого ярлыка, который я проставляю.Мне также не нужно писать нелепый подкласс label (который также был предложен в этой теме и выполняет большое количество пользовательских отрисовок), который я нахожу довольно гротескным.Теперь я все еще мог бы создать подкласс для всех своих меток, но тогда есть случай встроенных меток в другие объекты пользовательского интерфейса, то есть UIButtons.Я бы хотел, чтобы встроенные метки также не были нарушены.

Любые предложения были бы замечательными.Спасибо.

Это было полезно?

Решение 2

Что вы, ребята, думаете по этому поводу?

Возьмите исходный адрес метода для initWithCoder во время выполнения и сохраните его в статической переменной.Выполните проверку метода на нем, чтобы заменить реализацию classes на my initWithCoder .И затем в моем initWithCoder я бы вызвал исходный метод, хранящийся в статической переменной.

Вы можете поместить его в категорию и вызвать этот шаг инициализации класса в начале программы, убедившись, что его нельзя вызвать дважды, или, если это так, он ничего не делает.

Это кажется опасным, но я чувствую, что это должно сработать.

Другие советы

Из Справочная библиотека Mac OS X:

Когда категория переопределяет унаследованный метод, метод из категории может, как обычно, вызывать унаследованную реализацию через сообщение super.Однако, если категория переопределяет способ которые уже существовали в класс категории , нет способа вызвать исходную реализацию.

Метод swizzling должен работать так , как предложил kidnamedlox .

Ваш точно такой же вопрос обсуждался на этом занятии по iTunes в Стэнфорде Эваном Долллом

https://podcasts.apple.com/us/podcast/iphone-application-programming-spring-2009/id384233222

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top