我在調用initWithFrame:並在MKMapView和UIScrollView上釋放通知偵聽器來監視與外部設備的連接,以便我可以連接其他手勢識別器意見,像這樣:Swizzling initWithFrame:不適用於NIB中的對象
+ (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.
}
這對於我在代碼中創建視圖的偉大工程,但如果我在廈門國際銀行宣佈他們我的方法不被調用。我使用swizzling而不是繼承,因爲我不想對此支持進行硬編碼 - 我希望能夠按每個目標添加它。
我能做些什麼來鉤住這些對象,以便我可以爲這些類型的所有對象添加手勢識別器,無論我是以編程方式還是在NIB中創建它們?
太棒了!非常感謝你爲我的iOS fu添加了更多珍聞。 – 2011-05-12 01:47:37
注意:Bavarious可能更適合不符合'NSCoding'的東西。 – Wevah 2011-05-12 01:48:25
在[資源編程指南](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs)中介紹了接收'-initWithCoder:'或'-init'的Unsmarshalled nib對象/CocoaNibs.html)。 – 2011-05-12 01:52:22