Swift + Objective C swizzling class_getInstanceMethod возвращает нольIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Swift + Objective C swizzling class_getInstanceMethod возвращает ноль

Сообщение Anonymous »

Я использую AsyndDisplayKit/Texture, где:
https://github.com/TextureGroup/Texture ... ASTextNode имеет эту функцию:

Код: Выделить всё

+ (CGColorRef)_highlightColorForStyle:(ASTextNodeHighlightStyle)style
{
return [UIColor colorWithWhite:(style == ASTextNodeHighlightStyleLight ? 0.0 : 1.0) alpha:1.0].CGColor;
}
К сожалению, это не раскрыто. Поэтому я не могу изменить цвет выделения. Итак, я пытаюсь это провернуть, используя это:

Код: Выделить всё

extension ASTextNode {

@objc func swizzledHighlightColor() -> CGColor {
return UIColor.red.cgColor
}

static func swizzle() {
let originalSelector = NSSelectorFromString("_highlightColorForStyle:")

let swizzledSelector = #selector(ASTextNode.swizzledHighlightColor)

print("originalSelector: \(originalSelector)")
print("swizzledSelector: \(swizzledSelector)")

let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

print("originalMethod: \(String(describing: originalMethod))")
print("swizzledMethod: \(String(describing: swizzledMethod))")

if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
Здесь метод_exchangeImplementations завершается с ошибкой, поскольку исходный метод, полученный class_getInstanceMethod, возвращает ноль. Вывод выше:

Код: Выделить всё

originalSelector: _highlightColorForStyle:
swizzledSelector: swizzledHighlightColor
originalMethod: nil
swizzledMethod: Optional(0x00000001046b5e09)
Для отладки я распечатал это, и оно работает:

Код: Выделить всё

let selectorPerformed = ASTextNode.perform(originalSelector)
print("selectorPerformed: \(String(describing: selectorPerformed))")
принты:

Код: Выделить всё

selectorPerformed: Optional(Swift.Unmanaged(_value:  [ (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )))
Итак, исходный селектор верен. Почему тогда class_getInstanceMethod терпит неудачу?
РЕДАКТИРОВАТЬ: Я понял проблему. Я опубликовал решение ниже.

Подробнее здесь: https://stackoverflow.com/questions/784 ... urning-nil
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Не удалось собрать модуль Objective-C при использовании Swift в модуле Objective-C.
    Anonymous » » в форуме IOS
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Метод Swizzling не вызывает оригинальных Touchesbegan и Touchesdended Methods в Swift
    Anonymous » » в форуме IOS
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • IOS (objective-c) compress_decode_buffer() возвращает ноль
    Anonymous » » в форуме IOS
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Невозможно вызвать приложение метода экземпляра Swizzling AppDelegate (_:open:options:), нажав на глубокую ссылку схемы
    Anonymous » » в форуме IOS
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • Метод обмена сообщениями Firebase Swizzling не работает
    Anonymous » » в форуме IOS
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»