Как вызвать исходную функцию из перегруженной функции в категории? - PullRequest
4 голосов
/ 04 октября 2009

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

@interface UILabel(CustomInit)

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

@end

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

EDIT

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

EDIT

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

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

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

Любые предложения будут великолепны. Спасибо.

Ответы [ 3 ]

13 голосов
/ 04 октября 2009

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

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

1 голос
/ 04 октября 2009

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

Точно такой же вопрос обсуждал в этом классе Стэнфордского университета ITunes Эван Долл

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

1 голос
/ 04 октября 2009

Как вы, ребята, относитесь к этому?

Получите исходный адрес метода для initWithCoder во время выполнения и сохраните его в статической переменной. Сделайте метод swizzle на нем, чтобы заменить реализацию классов моим initWithCoder. А затем в моем initWithCoder я бы вызвал оригинальный метод, хранящийся в статической переменной.

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

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

...