0

我正在创建一个将用于 iOS 网格视图的接口/协议。我试图在类中封装尽可能多的信息,给类及其子类的用户留下很少的信息。我坚持回调方法或委托应该是什么。在 C 或 C++ 中,我需要一个函数指针作为参数传递给在触摸事件上调用的方法。在Objective C(我相当新)中,我对块和选择器感到困惑。从我所看到的Apple方式是使用选择器。所以这个类应该需要一个方法被设置为当检测到触摸事件时会发生什么的选择器。我不想做大量的子类化,因为这会限制可重用性并在每次使用此接口时强制执行更多编码。我包括有限的代码,到目前为止我使用选择器所做的工作,但我愿意接受有关如何使用块来完成相同操作以及为什么会更好的建议。我没有测试过这个,我目前正在设计它。

@protocol Grid <NSObject>
@required

/*! @brief Initializer for base class */
- (id) init:(UIView *)parent withSelector:(SEL)selector;
/*! @brief Draw the actual view */
- (void) draw:(CGRect) rect;
/*! @brief Reload the data */
- (void) reload;
@end

标题具有误导性,自从发布此问题以来,我对 Objective-C 中的工作方式有了更好的了解。这是关于抽象基类、继承和多态性,而不是将选择器设置为属性或委托

4

1 回答 1

1

您应该做的是要求该类(可能是委托)符合您的协议。你可以这样做。

@interface GridView : UIView {
    id<Grid> delegate;
}

...

@end

并让用户指定委托属性。在这一点上,您对委托的所有了解就是它符合 Grid 协议,因此您可以确定它实现了所有必需的方法。请注意,您永远不应该在协议中使用任何类型的 init 方法,因为您的类 ( GridView) 永远不必分配自己的委托,这完全违背了目的。

在您将用作委托的类中,您必须确保它符合Grid协议,以便它可以用作委托。看起来像这样。

@interface GridDelegateObject : NSObject <Grid> {
...
}

...

@end

并且您必须至少为Grid协议中所需的方法提供实现。

那么您应该将GridView实例的委托设置为GridDelegateObject.

[gridViewInstance setDelegate:gridDelegateObjectInstance];

然后你可以调用gridDelegateObject从你的Grid协议中实现的所有方法gridViewInstance,就像这样。

-(void)someMethod {
    [delegate reload];
}

或类似的东西。这将调用 reload 函数gridDelegateObjectInstance

于 2012-08-17T14:44:28.867 回答