Как мне заменить экземпляр класса в системе на подкласс в Objective-C? - PullRequest
1 голос
/ 31 августа 2011

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

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

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

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

1 Ответ

3 голосов
/ 31 августа 2011

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

...