Как мне заменить экземпляр класса в системе на подкласс в Objective-C?

Я подклассифицировал системный класс (UINavigationBar, чтобы быть определенным), чтобы добавить некоторую определенную функциональность. Я использовал это везде, как замену UINavigationBar. Однако теперь я хочу заменить некоторые UINavigationBars, используемые в системных платформах, на мой собственный подкласс, чтобы они обеспечивали такое же поведение. В частности, я хотел бы, чтобы UINavigationBar в контроллере больше представления UITabBarController был экземпляром моего класса.

Я думал, что это может быть невозможно, поэтому я попытался создать категорию на UINavigationBar, которая будет распространяться повсюду в системе. Тем не менее, моя категория должна была бы выполнить некоторую пользовательскую инициализацию и демонтаж (подписка и отписка от уведомления NSNotificationCenter). Если я перезапишу методы init/dealloc в своей категории, я не смогу вызывать оригинальные методы (как реализовано в UINavigationBar), которые могут быть очень опасными / фатальными /, вероятно, не очень функциональными.

Одним из возможных решений является метод Swizzling, но я не совсем уверен, как его использовать, и это может быть довольно сложно.

Если кто-нибудь сможет подробно рассказать о том, как реализовать что-то, что решило бы мои проблемы (или какой-нибудь специальный код для того, как я мог бы использовать метод swizzling), я был бы очень благодарен.

1 ответ

Решение

Вы можете переопределить +allocWithZone: метод в классе UINavigationBar, чтобы вместо этого создать экземпляр вашего подкласса (так же, как ведет себя кластер классов), используя функцию method_setImplementation() (для получения более подробной информации о функции см. Справочник по времени выполнения Objective C).

Другие вопросы по тегам