2011-04-25 125 views
11

我已經創建了UIView的子類,並且希望它發佈在Interface Builder(實際上是Xcode4)中顯示的自定義事件右鍵單擊Xco​​de 4設計器中的控件時,UIButton等控件的方式在「已發送事件」區域中有一堆事件。我知道我可以使用委託(通過協議)或通知(通過U​​INotificationCenter)讓特定事件發生時使用我的自定義視圖的對象知道,但我想知道「目標 - 作用機制」(描述在Cocoa Fundamentals Guide)是合適的/可取的/可能的,可以使用並與Xcode設計者集成。從主要的.NET背景來看,這種方法似乎與.NET事件模型密切相關,並且對我最有意義。將我自己的事件添加到我自己定製的UIView的Interface Builder菜單中的「發送事件」

回答

5

UIControlEventApplicationReserved,它爲您提供了一系列您的應用可以使用的事件標識符。但是,我不認爲有任何方法可以告訴Interface Builder關於應用程序定義的事件,所以您不會像在UIControl的標準事件中發現的那樣,在IB中獲得與您的事件相同的支持。相反,您必須在代碼中爲每個應用定義的事件指定目標和操作。 (如果我誤解了這一點,請有人糾正我。)這並不困難,但有點不同。

+0

啊,好的。必須提供「目標」似乎比設置委託更加複雜,儘管我想我可以讓我的自定義UIView作爲NSObject使用(通過屬性或方法),因此我的視圖不必包含頭文件對於在應用層次結構中位置較高並且緊密耦合的對象。我的猜測是,這是在設計器中進行連接時發生的情況,所以它可能是同樣的事情。它看起來好像是標準的,或者是首選的方法就是使用授權。我無法找到有關上述「目標 - 行動機制」的更多信息。 – dreyln 2011-04-25 22:06:05

+0

他們非常相似的想法。視圖控制器通常是它所管理的視圖和控件的目標和/或委託。在這種情況下,它只會將'self'作爲目標,並將其中一個選擇器作爲調用'-addTarget:action:forControlEvents:'的動作。 – Caleb 2011-04-25 23:07:10

3

一個簡單的方法是擴展UIControl而不是UIView,這將允許您將目標添加到所有默認事件(與UIButton相同)。

注意:爲了讓我的自定義UIControl處理事件,而不是我在其上分層的控件,我必須確保在所有分層控件上設置了userInteractionEnabled = NO

1

您可以使用IBOutletCollection完成此操作。這種方法的優點是可以在Interface Builder中鏈接對象。缺點是你不能直接鏈接到IBActions(如UIControl)。下面是一個使用協議乾淨實現:

ObserverProtocol.h

@protocol ObserverProtocol <NSObject> 
- (void)observedObjectChanged:(id)sender; 
@end 

MyObject.h

@interface MyObject : NSObject 
{ 
@private 
    IBOutletCollection(id<ObserverProtocol>) NSArray *observers; 
} 
- (void)objectChanged; 

MyObject.m

@implementation MyObject 

- (void)objectChanged 
{ 
    for (id<ObserverProtocol> observer in observers) 
    { 
     if ([observer respondsToSelector:@selector(observedObjectChanged:)]) 
     { 
      [observer observedObjectChanged:self]; 
     } 
    } 
} 

@end 

然後你只需要實現ObserverProtocol在你想要觀察事件的類中(當然還要在Interface Builder中進行綁定)。

相關問題