我正在调整initWithFrame:并且在MKMapView和UIScrollView上调用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中声明它们,我的方法就不会被调用。我正在使用调配而不是继承,因为我不想硬编码这种支持 - 我希望能够在每个目标的基础上添加它。
我可以做些什么来挂钩这些对象,以便我可以为这些类型的所有对象添加手势识别器,无论我是以编程方式还是在NIB中创建它们?
答案 0 :(得分:4)
查看从NIB实例化的对象使用-initWithCoder:
进行初始化,所以我会尝试调整它。
答案 1 :(得分:2)
在iOS中,从nib文件加载的每个对象都接收-initWithCoder:
(如果相应的类符合NSCoding
协议)或-init
(如果相应的类不符合从nib文件解组时的NSCoding
协议。这是与Mac OS X不同的行为,其中自定义视图会收到-initWithFrame:
,其他对象会收到-initWithCoder:
或-init
。
由于您的类继承自UIView
,符合NSCoding
协议,因此您需要调动-initWithCoder:
。