Objective c Swizzling initWithFrame:不';不适用于笔尖中的对象

Objective c Swizzling initWithFrame:不';不适用于笔尖中的对象,objective-c,swizzling,Objective C,Swizzling,我在MKMapView和UIScrollView上滑动initWithFrame:和dealloc以添加和删除通知侦听器以监视与外部设备的连接,这样我就可以为这些视图连接其他手势识别器,如: + (void) swizzleMethodsForFooCategory { SwizzleInstanceMethods(self, @selector(initWithFrame:), @selector(foo_initWithFrame:)); SwizzleInstanceMet

我在MKMapView和UIScrollView上滑动initWithFrame:和dealloc以添加和删除通知侦听器以监视与外部设备的连接,这样我就可以为这些视图连接其他手势识别器,如:

+ (void) swizzleMethodsForFooCategory
{
    SwizzleInstanceMethods(self, @selector(initWithFrame:), @selector(foo_initWithFrame:));
    SwizzleInstanceMethods(self, @selector(dealloc), @selector(foo_dealloc));
}

- (id) foo_initWithFrame: (CGRect) frame
{
    NSLog(@"foo_initWithFrame: called");
    self = [self foo_initWithFrame: frame];
    if (self != nil)
    {
        NSNotificationCenter * center = [NSNotificationCenter defaultCenter];
        [center addObserver: self
                   selector: @selector(foo_connectionDidSucceed)
                       name: @"PM_connectionDidSucceed"
                     object: nil];
        [center addObserver: self
                   selector: @selector(foo_didDisconnect)
                       name: @"PM_didDisconnect"
                     object: nil];
    }
    return self;
}

- (void) foo_dealloc
{
    NSLog(@"foo_dealloc called");
    [[NSNotificationCenter defaultCenter] removeObserver: self name: @"PM_connectionDidSucceed" object: nil];
    [[NSNotificationCenter defaultCenter] removeObserver: self name: @"PM_didDisconnect" object: nil];
    [self foo_dealloc];
}

- (void) foo_connectionDidSucceed
{
    // Add gesture recognizers.
}

- (void) foo_didDisconnect
{
    // Remove gesture recognizers.
}
这对于我在代码中创建的视图非常有效,但是如果我在XIB中声明它们,我的方法就不会被调用。我使用swizzling而不是继承,因为我不想硬编码这种支持——我希望能够在每个目标的基础上添加它


我可以做些什么来钩住这些对象,这样我就可以为所有这些类型的对象添加手势识别器,无论是通过编程还是在NIB中创建它们?

查看从NIB实例化的对象使用
-initWithCoder:
进行初始化,所以我会尝试将其替换为Swizzle。

在iOS中,从nib文件卸载时,从nib文件加载的每个对象接收
-initWithCoder:
(如果相应的类符合
NSCoding
协议)或
-init
(如果相应的类不符合
NSCoding
协议)。这与Mac OS X不同,在Mac OS X中,自定义视图接收
-initWithFrame:
,其他对象接收
-initWithCoder:
-init


由于您的类继承自
UIView
,它符合
NSCoding
协议,因此您需要swizzle
-initWithCoder:

太棒了!非常感谢您为我的iOS fu添加了一个小技巧。注意:对于不符合
NSCoding
的内容,BaVariable可能更合适。未编组的nib对象接收
-initWithCoder:
-init
在中进行了描述。