objective-c - 调配 initWithFrame : doesn't work for objects in a NIB

标签 objective-c swizzling

我正在 MKMapView 和 UIScrollView 上调配 initWithFrame: 和 dealloc,以添加和删除通知监听器以监视与外部设备的连接,以便我可以为这些 View 连接其他手势识别器,如下所示:

+ (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.
}

这对于我在代码中创建的 View 非常有用,但如果我在 XIB 中声明它们,我的方法就不会被调用。我使用调配而不是继承,因为我不想硬编码此支持 - 我希望能够在每个目标的基础上添加它。

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

最佳答案

从 NIB 实例化的 View 对象使用 -initWithCoder: 进行初始化,因此我会尝试对其进行调配。

关于objective-c - 调配 initWithFrame : doesn't work for objects in a NIB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5972393/

相关文章:

iOS 静态库不起作用

iphone - iPhone 设备上的 Method Swizzle

iOS - EXC_BAD_ACCESS 代码 = 1 UIWebView 在(方法混合)初始化后崩溃

objective-c - 巨大的核心数据对象

ios - AFNetworking NTLM 身份验证?

ios - 如何在 JavaScriptCore 中包含外部库?

ios - 如何在 objective-c 中动态创建类别?

swift - 既然 Swift 已经弃用了 macOS 中的 initialize() ,是否有替代方案?

ios - 警告 : Format string is not a string literal

ios - 静态链接动态框架