2011-05-12 24 views
2

我在調用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中創建它們?

回答

4

查看從NIB實例化的對象,使用-initWithCoder:進行初始化,所以我會嘗試改變它。

+0

太棒了!非常感謝你爲我的iOS fu添加了更多珍聞。 – 2011-05-12 01:47:37

+0

注意:Bavarious可能更適合不符合'NSCoding'的東西。 – Wevah 2011-05-12 01:48:25

+1

在[資源編程指南](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs)中介紹了接收'-initWithCoder:'或'-init'的Unsmarshalled nib對象/CocoaNibs.html)。 – 2011-05-12 01:52:22

2

在iOS中,從筆尖文件加載每個對象接受或-initWithCoder:(如果相應的類符合NSCoding協議)或-init從筆尖文件解組時(如果相應的類不符合NSCoding協議) 。這是與Mac OS X不同的行爲,其中自定義視圖接收到-initWithFrame:,而其他對象接收到-initWithCoder:-init

由於您的課程從UIView繼承,這符合NSCoding協議,因此您需要調整-initWithCoder:

+0

非常好,非常感謝。 – 2011-05-12 01:56:22