2011-04-25 84 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中进行绑定)。

相关问题